内存管理高级知识点-创新互联
属性的内部实现原理
成都创新互联专注于企业成都全网营销推广、网站重做改版、澄海网站定制设计、自适应品牌网站建设、H5响应式网站、购物商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为澄海等各大城市提供网站开发制作服务。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
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享文章:内存管理高级知识点-创新互联
标题路径:http://azwzsj.com/article/docogh.html