属性的内部实现原理
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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。