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

2024年11月16日 00:47
有2个网友回答
网友(1):

使用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。

网友(2):

- (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方法。