昨天介绍了OC中类的定义和使用:http://blog.csdn.net/jiangwei0910410003/article/details/41657603,今天我们来继续学习类的初始化方法和点语法的使用

一、首先来看一下类的初始化方法

在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意。

下面来看一下如何自定义初始化方法:

Person.h

  1. //
  2. //  Person.h
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject{
  10. NSString *_name;
  11. NSInteger _age;
  12. }
  13. //自定义初始化方法,必须以init开头
  14. - (id)initWithName:(NSString *)name withAge:(NSInteger)age;
  15. //打印信息
  16. - (void)showInfo;
  17. @end

这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作

注:OC中自定义初始化方法的名称必须是以init开头

在来看一下实现:

Person.m

  1. //
  2. //  Person.m
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import "Person.h"
  9. @implementation Person
  10. - (id)initWithName:(NSString *)name withAge:(NSInteger)age{
  11. //固定写法,可以背下来哦~~
  12. //调用父类的初始化方法
  13. self = [super init];
  14. if(self != nil){
  15. _name = name;
  16. _age = age;
  17. }
  18. return self;
  19. }
  20. - (void)test{
  21. NSLog(@"test");
  22. }
  23. - (void)showInfo{
  24. [self test];//调用自己的方法
  25. NSLog(@"name is %@ and age is %d",_name,_age);
  26. }
  27. @end

这里我们看到了,初始化方法返回的类型是id类型,关于OC中的id类型,可以认为和C语言中的void*是相等的,这种类型在OC中经常被用到,还有就是self关键字的使用,这里的self关键字就相当于Java中的this关键字,指代当前类对象,还有super关键字,这个和Java中的super也是一样的,指代父类对象。还有一个是nil,他就相当于Java中的null,空对象的概念,用于判断的。

同时这里还要记住一点:

以后OC中自定义初始化的方法的模板:

  1. //固定写法,可以背下来哦~~
  2. //调用父类的初始化方法
  3. self = [super init];
  4. if(self != nil){
  5. _name = name;
  6. _age = age;
  7. }
  8. return self;

这个没什么好说的,就是一个模板,所以初学者就背下来吧,不过用多了,自然就记住了。

下面来看一下如何使用初始化方法:

main.m

  1. //
  2. //  main.m
  3. //  03_InitDemo
  4. //
  5. //  Created by jiangwei on 14-10-10.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. int main(int argc, const charchar * argv[]) {
  11. @autoreleasepool {
  12. //初始化方法只能调用一次
  13. Person *person = [[Person alloc] initWithName:@"jiangwei" withAge:22];
  14. [person showInfo];
  15. person = [[Person alloc] init];
  16. [person showInfo];
  17. //id类型,类似于void*
  18. //但是id类型一般不这么使用,一般会作为方法的返回值和传入的参数类型
  19. id person1 = [[Person alloc] initWithName:@"huangdaoyang" withAge:23];
  20. [person1 showInfo];
  21. }
  22. return 0;
  23. }

我们使用了我们自定义的方法实例化了一个Person对象出来,同时调用他的showInfo方法,打印结果,这里我们也会发现Person的init方法任然可以使用,这个和Java中是有区别的,其实,在上篇文章中说到过,这个init方法是NSObject父类的,可以猜想到这个方法的逻辑功能就是初始化,所以我们在自定义初始化方法的时候,都是会用到这个方法的。当然我们可以定义多个初始化方法,后面我们在介绍Foundation框架的时候,会发现系统给我提供的类有很多自定义的初始化方法。

运行结果:

二、看一下OC中的点语法

OC中的点语法其实没什么高端的,但是他和Java中的那种使用对象变量直接访问public类型的变量的点是不一样的,所以这里就单独说明一下:

点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的

OC中的get方法和Java中不太一样,OC中只要一个方法有返回值都可以认为是get方法,Java中是形如getXXX这样的才叫做get方法。

下面来看一个例子吧:

Person.h

  1. //
  2. //  Person.h
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject{
  10. //点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的
  11. //这里的get方法和其他语言不一样,只要有返回值就是get方法
  12. NSString *_name;
  13. NSInteger _age;
  14. }
  15. - (void)setName:(NSString *)name;
  16. - (void)setAge:(NSInteger)age;
  17. - (NSString *)name;
  18. - (NSInteger) age;
  19. //这里要注意,showInfo也是一个get方法
  20. - (NSString *)showInfo;
  21. //只定义,不实现,所以在调用[person test]的时候,编译时候不会报错
  22. //但是运行的时候就会报错了,因为编译的时候只会判断方法有没有定义,而运行的时候是需要判断这个方法有没有实现
  23. - (void)test;
  24. @end

在{}中定义了两个属性,注意都是以下划线开头的。然后在给这两个属性定义get/set方法,这样我们就可以使用点语法来访问这两个属性了。

同时这里要注意的是其实showInfo方法也是一个get方法,因为他又一个返回值类型。

所以在OC中使用点语法有两个条件:

1、必须是属性

2、有对应的get/set方法

下面来看一下实现吧:

Person.m

  1. //
  2. //  Person.m
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import "Person.h"
  9. /**
  10. #import和#include的区别
  11. 1.当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误
  12. 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了
  13. */
  14. @implementation Person
  15. - (void)setName:(NSString *)name{
  16. _name = name;
  17. NSLog(@"setName is Execute");
  18. }
  19. - (void)setAge:(NSInteger)age{
  20. //这里要注意,如果我们定义的全局变量是age而不是_age的话
  21. //这里不能用age = age进行赋值
  22. //但是也不能使用self.age = age,因为self.age等价于[self setAge:age]这样就会出现死循环了
  23. //所以我们在定义全局变量的时候一般都会加上一个下划线以便区分
  24. _age = age;
  25. NSLog(@"setAge is Execute");
  26. }
  27. - (NSString *)name{
  28. NSLog(@"getName is Execute");
  29. return _name;
  30. }
  31. - (NSInteger) age{
  32. NSLog(@"getAge is Execute");
  33. return _age;
  34. }
  35. - (NSString *)showInfo{
  36. NSLog(@"showInfo is Execute");
  37. return _name;
  38. }
  39. @end

我们看到了这里对get/set方法的实现,看到上面的注释:

我们这里不能使用self.age = age,因为self.age等价于[self setAge:age],这样就会出现死循环了

这个和Java就有很大的区别了,Java中我们是可以使用this.age
=
age的,而且经常这样做,但是OC中不行,原因很简单,因为OC中的点语法相当于调用set/get方法,那么在set/get方法中调用set/get方法,那就会出现了死循环了。所以这点一定要注意。

还有一个需要注意的是,刚刚在Person.h中定义了一个test方法,但是在Person.m中并没有实现,在OC中编译是不会报错的,但是运行的时候就会报错了。

看一下如何使用点语法:

main.m

  1. //
  2. //  main.m
  3. //  04_UseDit
  4. //
  5. //  Created by jiangwei on 14-10-11.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. int main(int argc, const charchar * argv[]) {
  11. @autoreleasepool {
  12. Person *person = [[Person alloc] init];
  13. //此处的点语法调用的是set方法,等价于[person setName:@"jiangwei"];
  14. person.name = @"jiangwei";
  15. person.age = 22;
  16. //此处的点语法调用的get方法,等价于NSString *name = [person name];
  17. NSString *name = person.name;
  18. NSLog(@"name is %@",name);
  19. name = person.showInfo;
  20. NSLog(@"name is %@",name);
  21. //调用test方法
  22. [person test];
  23. }
  24. return 0;
  25. }

我们这里就可以使用点语法进行赋值和取值操作了,其实等价于调用他们的get/set方法。

运行结果:

这里需要注意的是报了一个错误,这个错误也是我们后面开发过程中经常犯的一个错误,就是这个方法没有实现,我们在Person.h中定义了test方法,但是没有在Person.m中进行实现,在main.m中进行调用就报了这个错误,但是编译的时候是没有报错的。

总结

今天就简单的介绍了OC中的初始化方法的定义和点语法的使用,其中初始化方法类似于Java中的构造方法,点语法就是get/set的缩减版

OC学习篇之---类的初始化方法和点语法的使用的更多相关文章

  1. (转载)OC学习篇之---类的初始化方法和点语法的使用

    昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的, ...

  2. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  3. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  4. (转载)OC学习篇之---类的定义

    之前已经介绍了OC中的一个程序HelloWorld,今天我们继续学习OC中类的相关知识. OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那 ...

  5. OC学习篇之---类的定义

    OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...

  6. (转载)OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用,那么这篇文章我们继续来介绍一下OC中的一个特性:延展. 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前 ...

  7. (转载)OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首 ...

  8. OC学习篇之---类的延展

    来源:http://blog.csdn.net/jiangwei0910410003/article/details/41775603 前一篇文章我们介绍了类的类目概念和使用:http://blog. ...

  9. OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,O ...

随机推荐

  1. NOIP专题复习3 图论-强连通分量

    目录 一.知识概述 二.典型例题 1.[HAOI2006]受欢迎的牛 2.校园网络[[USACO]Network of Schools加强版] 三.算法分析 (一)Tarjan算法 (二)解决问题 四 ...

  2. MySQL异常:Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

    Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or cl ...

  3. 简述FTP主动模式与被动模式

    1 FTP工作模式 2 不同模式FTP面临的问题 3 主动模式的FTP连接建立连接主要步骤 客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号 ...

  4. 在Linux中CSV转换成XLSX

    在linux中,把csv文件转换成excel表格(xlsx或者xls) $ echo -e 'surname,name,age\nCarlo,Smith,23\nJohn,Doe,46\nJane,D ...

  5. 腾讯ISUX网站的一个小问题

    腾讯isux网站的一个小问题. 它的网站:http://isux.tencent.com/?variant=zh-hans     优秀的网站和差的网站的距离往往就在于细节.   浏览环境:谷歌.   ...

  6. python之字符串处理 2014-4-5

    #字符串 p62 13:20pm-15:20 上一章讲的所有的序列化操作对于字符串同样适用 不过字符串不可变 所以无法使用分片赋值 1.字符串格式化 >>> format=" ...

  7. HDU 3749 Financial Crisis(点-双连通分量)

    Because of the financial crisis, a large number of enterprises go bankrupt. In addition to this, oth ...

  8. SpringBoot Data JPA 关联表查询的方法

    SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店 ...

  9. 【JZOJ4857】Tourist Attractions(Bitset)

    题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...

  10. ****使用ftp软件上传下载php文件时换行符丢失bug

    在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件 ...