我已经测试了它,看起来确实如此。所以我的问题是,它是否总是增加保留计数。
所以我每次都这样做:
UIView *theView = [[[UIView alloc] initWithFrame:(CGRect)aFrame] autorelease];
[self.view addSubview:theView];
我实际上是在泄漏记忆吗?
我有一个全局属性 @property (nonatomic, retain) UILabel *ingredientsTextLabel;
,我使用以下代码在viewDidLoad
中实例化:
我只有名为的属性,在我的标题中没有属性,所以没有getter和setter。在我的viewDidLoad
:
ingredientsTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ingredientsScrollView.frame.size.width, ingredientsScrollView.frame.size.height)];
[ingredientsTextLabel setBackgroundColor:[UIColor clearColor]];
[ingredientsTextLabel setFont:[UIFont fontWithName:@"Helvetica" size:18]];
[ingredientsTextLabel setText:ingredientsText];
[ingredientsTextLabel setNumberOfLines:0];
[ingredientsTextLabel setLineBreakMode:UILineBreakModeWordWrap];
NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 1
CGSize maxSize = CGSizeMake(ingredientsScrollView.frame.size.width, 9999);
CGSize ingLabSize = [ingredientsText sizeWithFont:ingredientsTextLabel.font
constrainedToSize:maxSize
lineBreakMode:ingredientsTextLabel.lineBreakMode];
[ingredientsTextLabel setFrame:CGRectMake(ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.origin.x, ingredientsTextLabel.frame.size.width, ingLabSize.height)];
[ingredientsScrollView addSubview:ingredientsTextLabel];
NSLog(@"%i",[ingredientsTextLabel retainCount]); // here retain count is 2!
现在我认为这样可行,然后在dealloc中我可以释放ingredientsTextLabel
,但保留计数为2,所以在addSubview 以及之后我还需要释放i吗?我没有意识到这种情况发生了! :(
答案 0 :(得分:10)
是的,“addSubview”会增加保留计数。这是有道理的,因为该方法存储了在超级视图也被释放之前不应该释放/释放的子视图。当superview发布时,它还会释放所有子视图。
答案 1 :(得分:3)
对象的绝对保留计数毫无意义。
您应该调用release
与导致保留对象完全相同的次数。不会少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。
有关详细信息,请参阅Memory Management Guidelines。
如果你+ new / + alloc / -retain / -copy(NARC)一个对象,你需要平衡retain与release(或autoerelease)。故事结局。绝对保留计数,特别是从框架类和/或传递给框架代码的类的实例的绝对保留计数,是一个实现细节,很可能不是你的认为应该是。
答案 2 :(得分:2)
当然,superView在addSubview上保留了subView:,因此在删除subView时会释放。