浅谈Objective-c 中的 strong 和retain

首先这篇文章的只是自已学习中的一些体会,并不可能完正确,如果您觉得我误导了你您 ,请您批评指正,我会在第一时间删除文章,以免误人子弟。

要说这两个字那就不得说内存管理了,那我们就先从MRC 说起吧。首先我建一个很简单的工程项目姑且命名为MemoryTest吧。结构如下,Next Page 跳转到下一页的,返回的时候我监听SecondViewController  dealloc 方法执行情况。

再者向项目中添加一个自义类:Test: 什么事情都不做只是重写dealloc 方法:

- (void)dealloc {

     [superdealloc];

    NSLog(@"Test----dealloc");   

}

然后我们在 SecondViewController 声明一个Test属性 

@property(nonatomic,retain)Test*test;

 重写dealloc 方法:

- (void)dealloc {

    [super dealloc];

    [_test release];

   NSLog(@"SecondViewController----dealloc");

然后 我们在viewDidLoad 方法中实例化一个Test对象:

- (void)viewDidLoad {

       [superviewDidLoad];   

       // Do any additional setup after loading the view.

       self.test= [[Testalloc]init];

       NSLog(@"testRetainCount-------%ld",[self.test retainCount]);

}

那么大家觉得些时的retainCount 是多少? 是1还是2 ? 如果你不确定请自己写个Demo 跑一下看看。 答案是 2  [ _test retainCount] 也是2 。通常我这么做后我们在 dealloc 中 调用 [_test release] 那么引用计数减1 这个时个引用计数不为0 那_test 对象释放吗?因为我重写了Test 的dealloc 方法 如果执行了会输出 "Test----dealloc.这段字符串。然后我跑一下程序看看 有没有输出:

可以看出没有输出,那说明这个对象没有被释放。此时就有内存泄漏了。可以用工具简测下看看。那要怎么解决呢 我们来看段代码dealloc 方法仍然不变, 我们来看下结果:

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view.

 _test= [[Test alloc] init];

NSLog(@"testRetainCount-------%ld",[self.test retainCount]);

}

跑一下看下输出结果:

可以看出 _test 对象的方法执行了。为什么呢? 请读者思考一下?

然后我们再在 SecondViewController 声明一个属性myArray

@property(nonatomic,retain) NSArray *myArray;

假如我们使用上面方法初始化:

_myArray = [_myArray new]; 这样写没有问题的,我们知道NSArray 有很多类方法可以返回很多自动释放对象如果我们写成这样子:_myArray = [_myArray array]; 可以看出有什么问题吗?为了发现问题我们在重写下viewDidAppear方法:

- (void)viewDidAppear:(BOOL)animated {

     [superview DidAppear:animated]; 

     NSLog(@"------%p",_myArray);

}

结果会怎么样呢 跑一下你会发现程序崩掉了,这就其了怪了为什么这样子?,我们再改我初始化改成 self.myArray= [NSArray array];  我们再跑一下发现没有问题输出了------0x7fdf28f01660。

看到这里我们是不是有疑问呢,或许你已经懂了,用retain关钮字 有时候用self. 会有问题,有时不用的也有会有问题?那什么时候用,什么时候不用呢?我仔细对比两个对象可以得出:

1. 如果返回的对象不是自动释放对象我们不要用self.初始化一个对象。

2.如果返回的象是自动释放对象我们最好用self.初始化一个对象(当然也可以不用,手动的retain  一次也可以解问题)

关于自动对象什么时候释放的问题读者可以自己搜索一下Runloop的知识。看到这里有没有对retain 有一点更深的理解呢,当然我说的只是其中的一小点,有兴趣的朋友可以自己写写看看。

说完了MRC下面,我们再说说ARC 下,选抛出一个问题,reain 关键字等于strong 吗?我们把我项目改成ARC 注意:ARC下是不能主动调用 [super dealloc]; 然后我们再按照上面的方法走一下看看,这里我就不详细一步步说了只说说结果好了。

我们先不改 retain的 关键字的,然后我们初始化self.test= [[Test alloc] init]; 跑下看看这次我们发现输出了,"Test----dealloc" 然后 _test= [[Test alloc] init] 这样子再跑一下:也一样输出 "Test----dealloc" 。我们改成strong 看看我们发现结果完全一样。再换成自动释放对象看看 self.myArray= [NSArray array] 再改成 _myArray= [NSArray array]; 我们发现这两次都没有问题都正确输出_myArray的地址。这样子看来 retain 在ARC却实等价的。

但是从MRC 和ARC下的分析来看他们内部结构应该不同的,MRC下会引发的问题ARC 下都没有发现,说明ARC 下应该是对strong 和retain 进行了优化。本质他们应该不是等价的。也有可能ARC retain 被直接替换成了strong 至他们内部应该是怎么样实现的,我也没有办法解释,还望有理解的大牛能指点一二。看到这里我们是不是应该理解下其他关键字呢

在这里也扯点闲话我们现在很多项目使用ARC 很多人用Java一样不再关心内存问题了,也不深入去学习object-c的基础知识了。最近面试了很久了@property后面可以有哪些修饰符?没有一个能回答完整的。很多人也越来越浮躁了,别人工资多少我就是多少?而不是我说的技术值多少。在这里我想对那些刚刚接触iOS开发的人说,一定要学好objetive-c 基础知识,静下来好好的学习一下MRC不是说MRC过时了就没有学习了必要,踏踏是学学才能对内存管理有清析的认识。我们时刻把内存的问题放在心上,要用最小内存去完成我们想要完成事。而不是只求功能实现就成万事大吉了。

有时间的话下次就分析一下,NSSting 为什么用Copy 好?也顺便分析下copy 也告诉您些你老师没有说有东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容