1 - (void)setAge:(int)age
2 {
3 _age = age;
4 }
1 - (void)setCar:(Car *)car
2 {
3 if ( car != _car) // 1.先判断是不是新传进来的对象
4 {
5 [_car release]; // 2.对旧对象做一次release
6 _car = [car retain]; // 3.对新对象做一次retain
7 }
8 }
1 - (void)dealloc
2 {
3 [_car release]; // 一旦Person release,则车也应该release
4 [super dealloc]; // 这段一定要放最后
5 }
6.@property 内存管理
@property (参数) 对象
eg :@property (nonatomic,retain) Car *car;
(1)set方法内存管理的相关参数
retain:生成的setter方法中会release旧值,retain新值。(适用于OC对象类型)
assin:直接赋值(默认,适用于非OC对象类型)
copy: release旧值,copy新值
。
(2)是否要生成set方法
readwrite:可读写,同时生成setter和getter的声明、实现(默认)
readonly:只读,只会生成getter的声明、实现。
(3)多线程管理(多个线程同时调用某个方法)
nonatomic:代表方法不要考虑线程安全性问题,告诉系统不在set方法中生成多线程代码。(高性能,禁止多线程,推荐使用)
atomic:代表给方法进行加锁,保证线程安全(默认,低性能)
线程保护机制:防止方法在未写入完成时,被其它线程调用,造成数据错误。
(4)setter和getter方法的名称
setter:setter = 方法名,决定了set方法的名称,方法名一定有冒号:
getter:决定了get方法的名称。(一般用在BOOL类型)
7.循环retain和@class
1>(1)@class使用方法:
作用: @class Card 仅仅告诉编译器,Card只是一个类
使用场合:用于.h声明此类,但是不会引入此类的方法和成员变量。
注意点:仅仅声明这个类,不会将此类的方法和成员变量导入,如果需要,则应该在.m文件中#import此类。
(2)引用一个类的规范
1>在.h头文件中用@class来声明类
2>在.m源文件中用#import来包含类的所有东西
(3)@class优点
1>解决循环包含的问题。- >只在.m 源文件中进行引用(可以循环声明,A中声明B,B中声明A)
2>提高了性能。->如果被引入类的头文件进行了修改,不需要全部进行重新编译。
(4)@class 和 #import 区别
1> #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;(使用类所有信息,包括成员变量和方法)
@class方式只是告诉编译器在A.h文件中 ,声明某个类,不知道此类的所有具体信息。(仅仅声明有这个类)
2>如果有上百个头文件都#import了同一个文件,那么一旦被导入文件的头文件稍有改动,后面引用到这个
文件的所有类的头文件都需要重新拷贝,效率较低。(A->B,B->C,C->D.....一旦A变动,则后面都需要重新编译。程序只编译.h文件)
使用@class方式就不会出现这种问题了,只需在源文件中修改类即可,提高了效率。
(解决了循环包含问题)
3>在.m实现文件中,如果需要引用到被引用类的成员变量或方法时,还需要使用#import方式引入被引用类。
2> 两端循环引用解决方法(循环retain)
一端用retain,一端用assign。、
Car 端 : @property (nonatomic,retain) Person *person;
Person端:@propertor (nonatomic,assign) Car *car
8. autorelease
eg: Person *p = [[[Person alloc] init] autorelease]; //必须存在释放池,才能写autorelease
作用:1>autorelease会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里所有对象做一次release。
2>返回对象本身,且不影响对象计数器。
注:池子被销毁时,对象不一定会被销毁,只是做一次release。释放池内可嵌套释放池
@autoreleasepool
{ // { 代表开始创建释放池
} // } 代表销毁释放
优点:1>不用在关心对象释放的时间.
2>不需要关心什么使用调用release。
缺点:不能精确控制对象销毁时间。
使用注意:1>占用内存较大的对象不要随便使用autorelease(不能精确控制对象销毁时间)
2>占用内存较小的对象使用,则不会有太大影响。