温馨提示×

温馨提示×

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

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

内存管理高级知识点

发布时间:2020-07-22 11:38:29 来源:网络 阅读:415 作者:Im刘亚芳 栏目:开发技术
  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

  • 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 




向AI问一下细节

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

AI