内存管理高级知识点

发布时间:2020-07-22 11:38:29 作者:Im刘亚芳
来源:网络 阅读:417
  1. 属性的内部实现原理

  2. dealloc内释放实例变量

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

  4. 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

Person.m中

- (void)dealloc{

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

       [super dealloc];

}


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中的对象会被retain

移除出collection的对象会被release 

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




推荐阅读:
  1. 内存管理
  2. 二、个人总结的菜鸟教程|sql教程的知识点(SQL高级教程)

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

collection return property

上一篇:一次竞拍系统的搭建部署总结+有感

下一篇:GO使用Webhook如何实现github自动化部署

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》