内存管理高级知识点-创新互联

  1. 属性的内部实现原理

    成都创新互联专注于企业成都全网营销推广、网站重做改版、澄海网站定制设计、自适应品牌网站建设、H5响应式网站购物商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为澄海等各大城市提供网站开发制作服务。
  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

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:内存管理高级知识点-创新互联
标题路径:http://azwzsj.com/article/docogh.html