17、方法定义(一个冒号代表一个参数,冒号也是属性方法的一部份)
方法类型 (返回值类型)方法名称[参数列表] {(一个冒号代表一个参数,冒号也是属性方法的一部份)
// 方法体
}
* 实例方法,方法名: sumAge:andNo:
- (int)setAge: (int)age andNo: (int)no {
// 在这里插入代码逻辑
}
* 静态方法
+ (id)initWithAge: (int)age {
// 在这里插入代码逻辑
}
注:
* 实例方法通过类的实例对象访问
* 静态方法通过类名或self访问
18、内存管理
1> 凡是从NSObject中继承的类都需要自己管理内存,在OC语法中,创建的任何一个对象都拥有一个引用计数器,第一次创建的时候这个引用计数器为1,当引用计数器的值为0时,该对象会被销毁。内存管理涉及到以下接口:
* release : 对象的引用计数器减1
* retain : 对象的引用计数器加1
* retainCount : 获取对象当前引用计数器的数量
对象生命周期回调接口:
* init : 对象的默认构造方法,如果自定义构造方法用于初始化成员变量时,必须先调用父类的构造方法,并判断获得的对象是否为nil,再初始化成员变量。
如:- (void)initWithAge: (int)age {
if ( self = [super init] ) { _age = age; } return self; }
* dealloc : 对象销毁时,系统会自动调用该方法,通常在该方法中释放内存或其它资源。在重写dealloc方法时,注意在代码最后面调用父类的dealloc方法,用于释放内存等相关资源。
如: - (void)dealloc { [_book release];// 释放成员变量 [super dealloc]; }
2> 不需要管理内存的对象
* 基本数据类型
* 系统自带的类调用自己的静态方法创建的对象,是自动释放内存的,不需要管理
3> 内存管理原则
只有向对象发送了alloc,retain,copy,new消息才有必要做release操作
* 谁alloc,retain,copy,new谁release
* 谁创建谁释放(release)
* 谁没有allock,retain,copy,new,你就不要做release操作
4> 自动内存管理(由autoreleasepool管理)
在创建对象的同时,调用autorelease方法,会将该对象的一个引用自动存放到最近创建的一个自动释放释放池中。以后该对象就不需要手动来release操作,徐非做了retain,copy等修改了引用计数器的操作。当自动释放池被销毁时,会向池子中所有对象发送一个release消息,池子中的所有对象的引用计数器此时会减1,只有当池子中的引用计数器为0时,该对象才会被彻底销毁。不是说只要将对象交给自动释放池了,池子被销毁,池子中的所有对象就一定会被销毁。
如:@autoreleasepool { Student *stu = [[[Student alloc] init]autorelease];// 此时stu对象将放到这个大括号中的自动释放池子中
[stu retain];// 如果加了这一句,此时stu的引用计数器为2,这时候如果在池子销毁前没有向对象发送release消息,就算池子销毁,该对象也还是会造成内存泄露
} // 程序执行到此处,代表自动释放池被销毁,意味着池子中的所有对象都会接到一个release消息
19、OC中的类似Java的toString方法
Student *stu = [[[Student alloc]init]autorelease];
NSLog(@"%@",stu);// 默认打印的是stu对象的内存地址
* 重写父类的description方法,可自定义打印对象的信息
- (NSString *)description {
NSLog(@"age is %i",_age);
}
|
|