我有一个子类UIView的类叫做BizView。我有以下代码
@property (nonatomic, retain)BizView * bizPlace;
/
@synthesize bizPlace = _bizPlace;
-(void) showBiz
{
BizView * biz = [[BizView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 30.0)];
self.bizPlace = biz;
[biz release];
self.bizPlace.delegate = self;
[self.bizPlace doStuff];
}
-(void) removeBizView
{
[self.bizPlace removeFromSuperview];
self.bizPlace = nil; //****** this does not call the dealloc of bizPlace
// [_bizPlace release]; >>>>>>this does call the dealloc
[self performSelector:@selector(showBiz) withObject:nil afterDelay:1];
}
//biz view delegates
-(void)didBizStuff:(BizView *)bView
{
[self.view addSubview:_bizPlace];
[self performSelector:@selector(removeBizView) withObject:nil afterDelay:1];
}
-(void)dealloc
{
self.bizPlace = nil;
[super dealloc];
}
现在根据互联网上的文档和各种文章,设置self.bizPlace = nil应该调用bizPlace的dealloc,但这不是这里的情况。 但是,调用[_bizPlace release]可以。这可能是什么原因?
答案 0 :(得分:0)
因此,您要比较的两个步骤存在明显差异。当您使用强指针合成bizPlace = _bizPlace时,您将为此特定元素分配内存。此时,您有一个强烈分配的指针(_bizPlace)作为此类的一部分。通过合成的setter将此值设置为nil不会导致类释放其成员变量,但是在该特定变量上调用release会导致_bizPlace被释放。
这里出现了nil设置的不同级别,这是你应该从中获取的主要内容。您应该注意,合成到变量的强属性与局部变量分配的行为不同。这是由于指向大块记忆的人数。