ios开发:内存管理用self.和不用self.的区别。。。有分

看图:.h文件,view2有retain参数.m文件,不使用self.的方法赋值使用self.的方法赋值请网友们帮忙解答一下好吗?... 看图:
.h文件,view2有retain参数

.m文件,
不使用self.的方法赋值

使用self.的方法赋值

请网友们帮忙解答一下好吗?
展开
 我来答
lihogjun
推荐于2016-01-29 · TA获得超过133个赞
知道答主
回答量:71
采纳率:0%
帮助的人:73.4万
展开全部
使用self.的方法赋值的retaincount是对的。
@property 关键字的作用是 给实例变量在.h文件里创建一个set/get函数的申明。
等同于 你自己在.h文件里面给实例变量写set/get函数申明。
@property (nonatomic,retain) UIView *view2;
等于
-(UIView*)getView2;
-(void)setView2:(UIView*)view;

在.m文件里的@synthesize关键字就是自动实现set/get函数。

retain关键字的作用是,在实现set函数内部,retain当前变量,具体实现是这样:
-(void)setView2:(UIView*)view
{
[_view2 release];
_view2 = [view retain];
}


self.view2 = tView;
等于
[self setView2:tview];

也就是说,如果不用self.调用实例变量,retain关键字是不起作用的。

self.view2 = tView; 之后 其实tView和view2都是同一个对象,只是这个赋值的发操作把tView的retaincount+1了而已。所以当 [tView release]之后,self.view2的retaincount-1。然后当再次给 self.view2赋值的时候,在set内部会再次release。这样是不会有内存泄露的。
--------------------------------------------------------------------------------------------------------------
在不使用self.的图片里,为什么在 [tView release]之后,retaincount还是1呢?
这是因为 [tView release]之后, tView retaincount实际变成了0,然后tView 就被释放掉了。
你后面调用tView.retainCount其实是没意义的,tView已经被释放了。
所以你看到的1其实是,retainCount,retainCount2这2个变量前面被赋值的值。
你如果改成赋值给一个新的变量,你就会发现是0了。而这个0其实是新的变量的初始化的值0,并不是tView.retainCount返回的0。
追问


这里release会挂掉,我在veiwDidLoad方法写的。

但是我把[tView release]写到最后面却不会挂掉。

好奇怪。

这里该怎么管理?

不是alloc后,赋给了_view2就该立刻release的嘛?

还有,原来那个问题真的和你说得一样,在不使用self.的时候那个reatinCount真的是上面的值,release后还是上面那个值。

能加个QQ吗?交流一下。

追答
你追问的图片里的红字理解是正确的。
使用self.的作用就是在于 调用set函数去给实例变量赋值。
不使用self. 直接使用_view2赋值就是等于直接给实例变量赋值,不会经过set函数。
在有retain关键字的情况下,set函数里面实现了传入新参数的retain,旧参数的release。所以这样可以更好的管理传参时的内存管理。这就是为什么Apple推荐大家都用self.进行实例变量的赋值。不到万不得已的情况,不要随便直接使用_view2实例变量直接赋值。在遵循使用self.规则前提下,self.view2 = tView;语句之后 就可以立刻对[tView release]. 但是你的代码是直接使用_view2赋值的,没进过set函数,没了tView 没有retain,后面你再[tView release],其实这里tView 就已经释放了。然后你再去访问tView 的retainCount属性,必然是要crash的。

对于你前面没使用self.的那张图我也觉得程序要crash。晚上我回去试验一下吧,确定一下。
lc5491137
2014-05-16 · TA获得超过534个赞
知道小有建树答主
回答量:547
采纳率:0%
帮助的人:435万
展开全部
- (void)setView2:(UIView *)view2{
    [view2 retain];
    //view2.retainCount == 2
    [_view2 release];
    //_view2.retainCount == 0
    _view2 = view2;
    //_view2.retainCount == 2
}

view2作为属性会自动生成setter和getter方法。self.view2 = tview;会调用上方的setter方法。

追问
那么不使用self.赋值的时候是不是不会调用上面的setter方法来retain呢?
追答
是的你可以试下  
_view2 = tview;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式