一、属性的内部实现原理
assign的属性内部实现
setter方法:
// setter方法
@property (nonatomic, assign) NSString *name;
- (void)setName:(NSString *)name
{
_name = name;
}
getter方法:
// getter方法
- (NSString *)name
{
return _name;
}
观察下面代码会出现什么问题?
NSString *name = [[NSString alloc] initWithFormat:@”张三”];
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@”%@”, [p name]); // 如果对象类型使用assign之后,会出现野指针异常
[p release];
retain的属性内部实现
setter方法:
// setter方法
@property (nonatomic, retain) NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name) {
[_name release];
_name = [name retain];
}
}
getter方法:
// getter方法
- (NSString *)name
{
return [[_name retain] autorelease];
}
copy的属性内部实现
setter方法:
// setter?法
@property (nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name) {
[_name release];
_name = [name copy];
}
}
getter方法:
// getter方法
- (NSString *)name
{
return [[_name retain] autorelease];
}
二、dealloc内释放实例变量
dealloc是NSObject的?个实例方法,与alloc对应,用于回收开辟的内存空间。这个?法在对象引用计数为0时,由系统自动调用通常我们在dealloc中释放类的实例变量。
dealloc使用
以Person.m为示例,代码如下:
- (void)dealloc
{
[_name release]; //释放setter?法泄露的实例变量
[super dealloc];
}
注意:
- 永远不要?动调用dealloc。
- 在dealloc?法的最后一?,必须写
[super dealloc];
。
三、便利构造器?法的实现原理
以Person.m为示例,代码如下:
+ (id)personWithName:(NSString *)name
{
Person *p = [[Person alloc] initWithName:name];
return [p autorelease];
}
return [p autorelease];
是最完美的解决?案,既不会内存泄露,也不会产?野指针。
四、collection的内存管理
collection就是NSArray,NSDictionary,NSSet…等容器类,collection会自主管理?己内部的元素。
collection内存的?主管理,加入collection中的对象会被retain,移除出collection的对象会被release,collection被释放会对内部所有对象release。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-11 10:39:55