码迷,mamicode.com
首页 > 移动开发 > 详细

iOS内存管理使用非自己生成对象的相关问题

时间:2016-01-28 07:03:14      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

一、用于测试的自定义类
@interface CustomedObj:NSObject

+ (instancetype) methodInit;
@end

@implementation CustomedObj

+ (instancetype)methodInit {
    CustomedObj *temp = [[CustomedObj alloc] init];
    return temp;
}

- (void) print {
    NSLog(@"==== Customed Object print");
}

- (void)dealloc {
    NSLog(@"对象即将被析构");
}
@end
 
二、实验结论
      2.1  非自己生成的对象,即alloc/new/copy/mutableCopy以外的创建方法取得对象,并且赋值给非strong变量时,对象将会自动注册至autoreleasepool,从而不至于立刻被析构; (3.1)
      2.2  当赋值给给strong变量时,编译器作自动优化插入objc_retainAutoreleaseedReturnValue, 而不是插入retain,以避免注册至autoreleasePool.(3.3)
      2.3  访问weak变量时,将会把指向对象注册至autoreleasePool.(3.3)
 
三、实验代码
      3.1   非alloc/new/copy/mutableCopy获取对象,自动注册至autoreleasepool
@autoreleasepool {
        __weak CustomedObj *weakRef = [CustomedObj methodInit];// 对象自动注册至autoreleasepool,执行完retainCount=1
        [weakRef print];//执行完retainCount=1
    }
    NSLog(@"退出 autoreleasepool”);

Log:
 ==== Customed Object print
 对象即将被析构
 退出 autoreleasepool

 

      3.2   alloc/new/copy/mutableCopy获取对象,不会自动注册至autoreleasepool,必须主动强持有以保证不被析构

@autoreleasepool {
        __weak CustomedObj *weakRef = [[CustomedObj alloc] init];//编译警告,对象析构
        [weakRef print]; // print消息将被发至nil
    }
    NSLog(@"退出 autoreleasepool”);

LOG:
 对象即将被析构
 退出 autoreleasepool

 

      3.3   weak指针被访问时,如未注册,系统自动将对象注册至autoreleasepool,引用计数增加

@autoreleasepool {
        CustomedObj *strongRef = [CustomedObj methodInit];//变量默认为__strong,因为编译器优化,将不会注册至autoreleasepool, retainCount=1
        __weak CustomedObj *weakRef = strongRef;
        [weakRef print];//调用weak指针会将对象注册到autoreleasepool,执行完retainCount=2
    }
    NSLog(@"退出 autoreleasepool");
LOG:
 ==== Customed Object print
 对象即将被析构
 退出 autoreleasepool

iOS内存管理使用非自己生成对象的相关问题

标签:

原文地址:http://www.cnblogs.com/hushuai-ios/p/5165049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!