分享

【内存管理】:什么时候应该使用retain

 quasiceo 2015-02-28
分类: ios 2012-03-25 14:55 971人阅读 评论(0) 收藏 举报

----------------------------------------------------------------------------------------------------------------------------------------------------------

问:

官方例子中的代码,
UIButton *infoButton = [[UIButton buttonWithType:UIButtonTypeInfoLight] retain];

为什么不写成
    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight] ;

两者有什么差别?

补充,这段代码是写在UIView子类的initWithFrame方法里

- (id)initWithFrame:(CGRect)frame viewController:(LevelViewController *)aController {
    self = [super initWithFrame:frame];
    if (self != nil) {
     UIButton *infoButton = [[UIButton buttonWithType:UIButtonTypeInfoLight] retain];
     ……………………
    }
    return self;

}

疑问:infoButton是一个局部变量,只出现在initWithFrame方法里,其他没有要用到的地方。
这样写,是不是一个习惯问题。



回答一
UIButton *infoButton = [[UIButton buttonWithType:UIButtonTypeInfoLight] retain];

retain一下计数加1,表示我的代码需要使用这个infoButton,可能在其它地方会使用,使用完了手动release一下

目的在于避免系统autorelease掉这个button

回答二
buttonWithType是类方法,它创建的对象系统会自动释放的。
所以应该retain保持一下,等这个对象使用完了,再release就可以。 


问题

仔细想了想,还有疑惑的地方。infoButton初始化的时候,不使用retain,也可以啊,
它是类方法创建的,被标记为autorelease,是不是程序结束的时候,才释放pool中的变量(就是里面的变量执行一次release。)
如果是这样,一直到程序运行结束前,也没有任何release infoButton的地方,所以retain一下,是不是真的多余里呢?

为什么执行到列表的 numberOfRowsInSection方法,数据的retain count就少了1?




主题推荐
内存管理 局部变量 对象 uiview 数据
猜你在找
ios面试题
iOS面试题转自网络
ios面试题
iOS面试题经典题型
史上最全的iOS面试题及答案
黑马程序员史上最全的iOS面试题及答案黑马 IOS 技术博客
最全的interviewTest
史上最全的iOS面试题及答案
iOS面试题及答案大总结
iOS 面试题
查看评论

  暂无评论

发表评论
  • 用 户 名:
  • ilvu999
  • 评论内容:
  • 插入代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多