iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码
// 1.对要传入的"新车"对象car和目前Person类对象所拥有的"旧车"_car进行判读
- (void)setCar:(Car *)car
{ if (_car != car ) { [_car release]; // 释放旧车 _car = [car retain]; // 新车引用计数加一 } } // 2.Person类在回收的时候也必须将它所拥有的车对象回收 - (void)dealloc { // Person对象被回收 那么将Person类对象拥有的Car对象_car对象也应该被回收 [_car release]; [super dealloc]; }
如果有很多个类要被引用那要写很多类似的代码,那么可以用@Property来自动生成上面的代码,但是必须借助@Property的参数,可分为四种类型:
1.set方法内存管理相关的参数
retain:用于任何OC对象类型,可以自动生成set方法中管理内存的代码,作用和上面示例中的set方法中的代码作用一致
assign:用于任何非OC对象,比如:枚举、结构和基本数据类型,可以自动生成set方法不涉及管理内存操作
copy:release旧值,copy新值一般用于NSString
2.是否要生成set方法参数
readwrite:同时生成get、set方法的声明、实现(默认)
readonly:只会生成get方法的声明和实现
3.多线程管理参数
nonatomic:性能比较高(一般用它)
atomic:性能低(默认)
4.是否为sett和get方法重命名
@property (getter = getAge,setter = setAge:) int age; // 在定义属性的时候可以自定义get/set方法的名 set方法一定要加冒号
// 这个参数主要用于BOOL类型在调用get方法的时候 方法名最好以is开头 @property (getter = isRich) BOOL rich; // 返回是否富有 那么get方法最好以is开头 BOOL b = person.isRich;
5.总结:在内存管理中常用的写法如下
@property (nonatomic,retain) NSString *name; @property (nonatomic,retain) Book *book;
@property (nonatomic,assign) int age;
它的作用如下面代码:
// 1.对要传入的"新车"对象car和目前Person类对象所拥有的"旧车"_car进行判读 - (void)setCar:(Car *)car { if (_car != car ) { [_car release]; // 释放旧车 _car = [car retain]; // 新车引用计数加一 } }
可以看出:@propery已经实现了,OC对象在set方法中一部分的内存管理,但是还是没有完全回收对象如下代码的作用就没有体现
// 2.Person类在回收的时候也必须将它所拥有的车对象回收 - (void)dealloc { // Person对象被回收 那么将Person类对象拥有的Car对象_car对象也应该被回收 [_car release]; [super dealloc]; }
那怎么办呢?