内存管理高级知识点
属性的内部实现原理
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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。