昨天介绍了OC中类的定义和使用:http://blog.csdn.net/jiangwei0910410003/article/details/41657603,今天咱们来继续学习类的初始化方法和点语法的使用框架
1、首先来看一下类的初始化方法学习
在Java中咱们知道一个每一个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,可是这里有一个区别是:Java中有默认构造方法,当咱们去自定义构造方法的时候,这个默认构造方法就会被替换了,可是OC中是不会的,这点须要注意。this
下面来看一下如何自定义初始化方法:spa
Person.h.net
// // Person.h // 03_InitDemo // // Created by jiangwei on 14-10-10. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *_name; NSInteger _age; } //自定义初始化方法,必须以init开头 - (id)initWithName:(NSString *)name withAge:(NSInteger)age; //打印信息 - (void)showInfo; @end这里咱们定义了一个初始化方法,对名称和年龄进行初始化赋值操做
注:OC中自定义初始化方法的名称必须是以init开头code
在来看一下实现:对象
Person.mblog
// // Person.m // 03_InitDemo // // Created by jiangwei on 14-10-10. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Person.h" @implementation Person - (id)initWithName:(NSString *)name withAge:(NSInteger)age{ //固定写法,能够背下来哦~~ //调用父类的初始化方法 self = [super init]; if(self != nil){ _name = name; _age = age; } return self; } - (void)test{ NSLog(@"test"); } - (void)showInfo{ [self test];//调用本身的方法 NSLog(@"name is %@ and age is %d",_name,_age); } @end这里咱们看到了,初始化方法返回的类型是id类型,关于OC中的 id类型,能够认为和C语言中的void*是相等的,这种类型在OC中常常被用到,还有就是 self关键字的使用,这里的self关键字就至关于Java中的this关键字,指代当前类对象,还有super关键字,这个和Java中的 super也是同样的,指代父类对象。还有一个是 nil,他就至关于Java中的 null,空对象的概念,用于判断的。
同时这里还要记住一点:ip
之后OC中自定义初始化的方法的模板:开发
//固定写法,能够背下来哦~~ //调用父类的初始化方法 self = [super init]; if(self != nil){ _name = name; _age = age; } return self;这个没什么好说的,就是一个模板,因此初学者就背下来吧,不过用多了,天然就记住了。
下面来看一下如何使用初始化方法:
main.m
// // main.m // 03_InitDemo // // Created by jiangwei on 14-10-10. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //初始化方法只能调用一次 Person *person = [[Person alloc] initWithName:@"jiangwei" withAge:22]; [person showInfo]; person = [[Person alloc] init]; [person showInfo]; //id类型,相似于void* //可是id类型通常不这么使用,通常会做为方法的返回值和传入的参数类型 id person1 = [[Person alloc] initWithName:@"huangdaoyang" withAge:23]; [person1 showInfo]; } return 0; }咱们使用了咱们自定义的方法实例化了一个Person对象出来,同时调用他的showInfo方法,打印结果,这里咱们也会发现Person的init方法任然可使用,这个和Java中是有区别的,其实,在上篇文章中说到过,这个init方法是NSObject父类的,能够猜测到这个方法的逻辑功能就是初始化,因此咱们在自定义初始化方法的时候,都是会用到这个方法的。固然咱们能够定义多个初始化方法,后面咱们在介绍 Foundation框架的时候,会发现系统给我提供的类有不少自定义的初始化方法。
运行结果:
2、看一下OC中的点语法
OC中的点语法其实没什么高端的,可是他和Java中的那种使用对象变量直接访问public类型的变量的点是不同的,因此这里就单独说明一下:
点语法只能适用于set/get方法,若是没有对应的set/get方法的话,是不能使用.语法的
OC中的get方法和Java中不太同样,OC中只要一个方法有返回值均可以认为是get方法,Java中是形如getXXX这样的才叫作get方法。
下面来看一个例子吧:
Person.h
// // Person.h // 04_UseDit // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject{ //点语法只能适用于set/get方法,若是没有对应的set/get方法的话,是不能使用.语法的 //这里的get方法和其余语言不同,只要有返回值就是get方法 NSString *_name; NSInteger _age; } - (void)setName:(NSString *)name; - (void)setAge:(NSInteger)age; - (NSString *)name; - (NSInteger) age; //这里要注意,showInfo也是一个get方法 - (NSString *)showInfo; //只定义,不实现,因此在调用[person test]的时候,编译时候不会报错 //可是运行的时候就会报错了,由于编译的时候只会判断方法有没有定义,而运行的时候是须要判断这个方法有没有实现 - (void)test; @end在{}中定义了两个属性,注意都是如下划线开头的。而后在给这两个属性定义get/set方法,这样咱们就可使用点语法来访问这两个属性了。
同时这里要注意的是其实showInfo方法也是一个get方法,由于他又一个返回值类型。
因此在OC中使用点语法有两个条件:
一、必须是属性
二、有对应的get/set方法
下面来看一下实现吧:
Person.m
// // Person.m // 04_UseDit // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Person.h" /** #import和#include的区别 1.当咱们在代码中使用两次#include的时候会报错:由于#include至关于拷贝头文件中的声明内容,因此会报重复定义的错误 可是使用两次#import的话,不会报错,因此他能够解决重复导入的问题,他会作一次判断,若是已经导入一次就不导入了 */ @implementation Person - (void)setName:(NSString *)name{ _name = name; NSLog(@"setName is Execute"); } - (void)setAge:(NSInteger)age{ //这里要注意,若是咱们定义的全局变量是age而不是_age的话 //这里不能用age = age进行赋值 //可是也不能使用self.age = age,由于self.age等价于[self setAge:age]这样就会出现死循环了 //因此咱们在定义全局变量的时候通常都会加上一个下划线以便区分 _age = age; NSLog(@"setAge is Execute"); } - (NSString *)name{ NSLog(@"getName is Execute"); return _name; } - (NSInteger) age{ NSLog(@"getAge is Execute"); return _age; } - (NSString *)showInfo{ NSLog(@"showInfo is Execute"); return _name; } @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
// // main.m // 04_UseDit // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *person = [[Person alloc] init]; //此处的点语法调用的是set方法,等价于[person setName:@"jiangwei"]; person.name = @"jiangwei"; person.age = 22; //此处的点语法调用的get方法,等价于NSString *name = [person name]; NSString *name = person.name; NSLog(@"name is %@",name); name = person.showInfo; NSLog(@"name is %@",name); //调用test方法 [person test]; } return 0; }咱们这里就可使用点语法进行赋值和取值操做了,其实等价于调用他们的get/set方法。
运行结果:
这里须要注意的是报了一个错误,这个错误也是咱们后面开发过程当中常常犯的一个错误,就是这个方法没有实现,咱们在Person.h中定义了test方法,可是没有在Person.m中进行实现,在main.m中进行调用就报了这个错误,可是编译的时候是没有报错的。
总结
今天就简单的介绍了OC中的初始化方法的定义和点语法的使用,其中初始化方法相似于Java中的构造方法,点语法就是get/set的缩减版