addSubview增量保留计数?

时间:2010-11-12 10:55:33

标签: iphone release retaincount

我已经测试了它,看起来确实如此。所以我的问题是,它是否总是增加保留计数。

所以我每次都这样做:

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吗?我没有意识到这种情况发生了! :(

3 个答案:

答案 0 :(得分:10)

是的,“addSubview”会增加保留计数。这是有道理的,因为该方法存储了在超级视图也被释放之前不应该释放/释放的子视图。当superview发布时,它还会释放所有子视图。

答案 1 :(得分:3)

不要使用-retainCount。

对象的绝对保留计数毫无意义。

您应该调用release与导致保留对象完全相同的次数。不会少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。

有关详细信息,请参阅Memory Management Guidelines

如果你+ new / + alloc / -retain / -copy(NARC)一个对象,你需要平衡retain与release(或autoerelease)。故事结局。绝对保留计数,特别是从框架类和/或传递给框架代码的类的实例的绝对保留计数,是一个实现细节,很可能不是你的认为应该是。

答案 2 :(得分:2)

实际上确实如此。 您可以在http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/addSubview

中参考此处

当然,superView在addSubview上保留了subView:,因此在删除subView时会释放。