这一编主要写set方法的内存管理 和 循环引用的内存管理
一、 set方法的内存管理
如果拥有OC对象类型的成员变量,就必须管理这个成员变量的内存,比如有个 Book *_book
1、 set方法的实现
- (void)set Book : (Book *)book
{
if(book!=_book){
[_book release];
_book = [book retain];
}
}
2 、然后在dealloc 方法中实现
-(void)dealloc
{
[book release];
[super dealloc];
}
3、 set方法内存管理的相关参数
1> retain : release 旧值 , retain 新值
2>assign : 直接赋值 (默认使用,适用于非oc对象)
3> copy : release 旧值,copy 新值
4 、 是否要生成set 方法
readwrite : 同时生成setter和getter的声明、实现
readonly: 只会生成getter方法
5 、 多线程管理
nonatomic :性能高 (一般就使用这个)
atomic : 性能低(默认)
6、 setter 和getter的方法名
setter : 决定了set方法的名称,一定要有写冒号;
getter : 决定了get方法的名称 (一般用在bool类型)
在声明时@property后面括号里面的参数只要不冲突(如果括号里面同时包含 retain 和 assign 是不会被允许的),括号里的参数可以任意多。
二 、 循环引用的内存管理
循环引用是一个很严重的问题。
下面是这样的一个例题 : 人有身份证 ;身份证包括人的信息。
代码如下:
person.h
sfz.h
运行结果是错误的,person 拷贝 sfz ,sfz 拷贝person 形成死循环。
解决方法:
1> 在.h 文件中使用@class 来声明类
2> 在.m文件中用#import来包含类的所以东西
person.h
person.m
sfz.h
sfz.m
一端用retain , 一端用assign。
这样就可以解决循环引用带来的问题。
总结:
@class 和#import 的区别
1> #import 方式会包含被引用类的所以信息,包括引用类的变量和方法
@class 方式只是告诉编译器在a.h文件中b.h 只是类的声明,具体这个类里面拥有什么消息这里不
需要知道。等文件实现中真正用到时,才会真正的去查看b类中的信息
2> 如果有上百个头文件都#import了同一文件,一旦头文件稍有改动,后面所有引用这个类的都需要重新
编译一次,影响效率。