属性的内部实现原理

dealloc内释放实例变量

便利构造器方法的实现原理

collection的内存管理

属性的语义特性及使用范围。assign retain copy

assign下的属性内部实现

setter方法getter方法@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
_name = name;
}- (NSString *)name
{
return _name;
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“张三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]); <——————这里因为上面[name release];了,造成野指针异常

[p release]

retain下的属性内部实现

setter方法getter方法@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name){
[_name release];
_name = [name retain];
}
}- (NSString *)name
{
return [[_name retain] autorelease];
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“张三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]);

NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

[p setName:newName];

[newName release];

NSLog(@“%@“, [p name]);

[p release]

copy下的属性内部实现

setter方法getter方法@property(nonatomic , assign)NSString *name;
- (void)setName:(NSString *)name
{
if(_name != name){
[_name release];
_name = [name copy];
}
}- (NSString *)name
{
return [[_name retain] autorelease];
}

main.m中.

NSString *name = [[NSString alloc] intwithFormat:@“张三]”;

Person *p = [[Person alloc] init];

[p setName:name];

[name release];

NSLog(@“%@“, [p name]);

NSString *newName = [[NSString alloc] initWithFormat:@“李四”];

[p setName:newName];

[newName release];

NSLog(@“%@“, [p name]);

[p release]

//疑问?始终有一块内存没有释放掉。。。。。。。


dealloc

dealloc是NSObject的一个实例方法,与alloc对应用与回收开辟的内存空间

这个方法在对象引用计数为0时,由系统自动调用

通常我们在dealloc中释放类的实例变量

Person.m中

- (void)dealloc{

[_name release]; //释放setter方法泄漏的内存,,,完美解决类上面的疑问。。

[super dealloc];

}


dealloc的注意事项

永远不要手动调用dealloc

在dealloc方法的最后一行,必须要写[super dealloc];

构造便利器的内存管理

------->在便利构造器的时候只有alloc开辟空间,可是没有释放,怎么办呢 ??


Person.m中

+ (instancetype)personWithName:(NSString *)name{

Person *p = [[Person alloc] initWithName:name];

return [p autorelease];

}

或者

+ (instancetype)personWithName:(NSString *)name{

return [[Person alloc] initWithName:name]autorelease];

}


collection

collection就是NSArray, NSDictionary, NSSet,,,,等容器类

collection会自主管理自己内部元素

加入collection中的对象会被retain

移除出collection的对象会被release

collection被释放会对内部所有对象release