6

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

所以每次我做这样的事情:

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

4

3 回答 3

10

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

于 2010-11-12T10:59:59.350 回答
3

不要使用 -retainCount。

对象的绝对保留计数是没有意义的。

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

有关完整的详细信息,请参阅内存管理指南

如果您 +new/+alloc/-retain/-copy (NARC) 一个对象,您需要平衡保留与释放(或 autoerelease)。故事结局。绝对保留计数,尤其是从框架类子类化和/或传递到框架代码的类实例的绝对保留计数,是一个实现细节,很可能不是您认为的那样。

于 2010-11-13T18:04:09.360 回答
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 时它会释放。

于 2011-12-21T02:03:07.907 回答