ios开发:内存管理用self.和不用self.的区别。。。有分
看图:.h文件,view2有retain参数.m文件,不使用self.的方法赋值使用self.的方法赋值请网友们帮忙解答一下好吗?...
看图:
.h文件,view2有retain参数
.m文件,
不使用self.的方法赋值
使用self.的方法赋值
请网友们帮忙解答一下好吗? 展开
.h文件,view2有retain参数
.m文件,
不使用self.的方法赋值
使用self.的方法赋值
请网友们帮忙解答一下好吗? 展开
2个回答
展开全部
使用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。
@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。
追问
追答
你追问的图片里的红字理解是正确的。
使用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。晚上我回去试验一下吧,确定一下。
展开全部
- (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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询