1.属性的内部实现原理
_name=name;
}
- (NSString *)name
{
return _name;
}
Person *per=[[Person alloc]initWithName:name gender:gender];
return [per autorelease ];//最完美的解决方案,既不会内存泄露,也不会产生野指针
}//注意命名,返回值的命名规范
(1)assign 语义属性的内部实现 :
setter:
-
- (void)setName:(NSString *)name
{_name=name;
}
- (NSString *)name
{
return _name;
}
注:这种方法对于对象类型的数据 容易产生野指针的情况 一般在属性类型为 非对象类型时使用
(2)retain
- (void)setName:(NSString *)name
{
if (_name!=name) { //如果不进行判断可能会造成野指针的错误
[_name release]; //先对旧的 release
_name=[name retain];//在对新的 retain
}
}
- (NSString *)name
{
return [[_name retain] autorelease ];
}
{
if (_name!=name) { //如果不进行判断可能会造成野指针的错误
[_name release]; //先对旧的 release
_name=[name retain];//在对新的 retain
}
}
- (NSString *)name
{
return [[_name retain] autorelease ];
}
(3)copy
- (void)setName:(NSString *)name
{
if (_name!=name) {
[_name release];
_name=[name copy];//和 retain 的唯一区别点
}
}
- (NSString *)name
{
return [[_name retain] autorelease ];
} //这一种 getter 方法只是coacoa 编程规范中的建议格式 保证最安全
{
if (_name!=name) {
[_name release];
_name=[name copy];//和 retain 的唯一区别点
}
}
- (NSString *)name
{
return [[_name retain] autorelease ];
} //这一种 getter 方法只是coacoa 编程规范中的建议格式 保证最安全
注: 对于 retain 和 copy 的使用
当关注的是 值 而不是 内存地址 的时候使用copy
当关注的是 内存地址 不是 值 的时候使用 retain
2.注意上面的 setter 方法可能会造成 实例变量_name的内存泄露
要解决这个内存泄露 可以在 类的 dealloc 方法中将 所有 retain 和 copy 的实例变量进行释放 [_name release];
dealloc方法 是NSObject的一个实例方法,与alloc对应用于内存空间的回收
系统在内存的引用计数为0时自动调用 忌手动调用
记住两句话: 谁创建(alloc,retain,copy)谁释放(release)
谁要使用谁就retain
正常的 dealloc 的实现方法
- (void)dealloc
{
//在 dealloc 中释放类的实例变量
//先释放自身类中的 对象类型的实例变量
[_name release];
[_gender release];
[_car release];
[_name release];
[_gender release];
[_car release];
//在调用从父类继承的 dealloc 方法 释放从父类继承而来的实例变量
[super dealloc];//注意必须要写 而且永远在最后一行
}
[super dealloc];//注意必须要写 而且永远在最后一行
}
3.便利构造器的内存管理(便利构造器在 内存管理 方面的便利之处)
+ (Person *)personWithName:(NSString *)name gender:(NSString *)gender
{Person *per=[[Person alloc]initWithName:name gender:gender];
return [per autorelease ];//最完美的解决方案,既不会内存泄露,也不会产生野指针
}//注意命名,返回值的命名规范
4.对于 Collection 即 NSArray NSDictionary,NSSet 等容器类 ,他们会自动管理自己内部的元素
加入 collection 中的对象会被 retain
移除 collection 的对象会被 release
collection 被释放的时候 会对内部所有的对象 release