一属性的内存管理
1属性的语义特征
①assign 基本数据类型(char,short,int,float,double)
<1>最开始使用的set get方法的实现
@property (nonatomic, assign) NSIntger age; set - (void)setName:(NSIntger)age { _age = age; } get - (NSIntger)age { return _age; }
<2>修改后的代码
set - (void)setName:(NSIntger)age { _age = age; } get - (void)setName:(NSIntger)age { [_age release]; _age = [age retion];
②retain 对象类型
@property (nonatomic, retain) NSString *name; set - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name retain]; } } get - (NSString *)name { return [[_name retain] autorelease]; }
③copy 对象类型,且遵循了<NSCopying>协议的
@property (nonatomic, copy) NSString *name; set - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name copy]; } } get - (NSString *)name { return [[_name retain] autorelease]; } 如果要对一个对象进?行copy操作,那该对象所属的类必 须遵守<NSCopying>协议
二dealloc释放那个实例变量
1dealloc是NSObject的一个实力方法,用于回收alloc开辟的内存空间
2这个方法在对象引用计数为0时,由系统自动调用
3通常我们在dealloc中释放类的实例变量
修改前(void)dealloc { [super dealloc]; }修改后 - (void)dealloc { [_name release]; [super dealloc
注意 永远不要手动调用dealloc
在dealloc方法的最后一行必须要写【super dealloc】,让系统真正去销毁对象
三便利构造器的内存管理
+ (id)personWithName:(NSString *)name { Person *p = [[Person alloc] initWithName:name]; return p; }
现在考虑p该如何释放?
+ (id)personWithName:(NSString *)name { Person *p = [[Person alloc] initWithName:name]; r[epturn [p autorelease]; } [p }
四集合的内存管理
1常见集合 NSArray NSDictionary ,NSSet
2集合会自主管理集合内部的元素
集合内存的管理方式:
①加入集合的元素会被retain
②移除集合的元素会被release
③集合被释放时会堆积和中所有元素release;
五KVC
1 kvc ;key Value Coding 键值编码 ,是一种间接访问器方法
2KVC 中常见的方法:
- (id)valueForKey:(NSString *)key; - (void)setValue:(id)value forKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues
虽然提供了这些方法但是对于想获取信息的时候也可以直接使用get方法
注意:当使用KVC时,如果key值和属性名不一样时就会放生程序运行崩溃
//如果是用kvc赋值,一定要重写这个方法,这个方法可以什么都不写,作用防止找不到key而崩溃 -(void)setValue:(id)value forUndefinedKey:(NSString *)key{ //NSLog(@"++=%@:%@",key,value); }
或者
- (id)valueForUndefinedKey:(NSString *)key { }
六ARC
1ARC 自动引用计数,由开发者开辟内存空间,但事实不需要释放内存空间,由系统自动释放空间
2ARC本质还是基于MRC的,只不过是系统自动添加了释放内存的方法
3ARC 是编译器特性,而不是运行时特性,更不是垃圾回收器
ARC的注意事项
1当工程开启ARC后由于编译器会自动帮你释放内存,所以和内存有关的操作retain release autorelease 都不能写
2当重写dealloc方法时 也不能写【super dealloc】,否则会报错
语意特性
① assign 基本数据类型
② strong 对象类型,相当于MRC中的retain
③ copy 对象类型 ,且遵守了<NSCopying>协议
④ weak 对象类型 ,但是内部不会对对象做retain的操作
ARC 与MRC的混编
如果需要对特定?文件开启或关闭ARC,可以在?工程选项中选择 Targets -> Compile Phases -> Compile Sources,在?里?面找到对应?文 件,添加flag: 打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc