【问题标题】:does addSubview increment retain count?addSubview 增量保留计数吗?
【发布时间】:2011-05-09 00:18:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone release retaincount


    【解决方案1】:

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

    【讨论】:

    • 正确。 Thomas,您不需要在 addSubview 之后再发布一次:您只需要担心每个 alloc/init 发布一次。如果 addSubview: 增加了保留计数,则释放它是他的责任。
    • 哦,对了……我明白了。谢谢你。这是否意味着如果我分配/初始化一个 UIView,将其添加为 self.view 的子视图,然后释放它,保留计数仍为 1?因此,即使我发布了它,我仍然可以向它发送消息吗?谢谢
    • 是的,没错。但是,如果您存储对 UIView 的引用,您还应该保留此 UIView。只是因为这是 Cococa/Obj-C 风格。
    【解决方案2】:

    不要使用 -retainCount。

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

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

    详情请参阅Memory Management Guidelines

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

    【讨论】:

      【解决方案3】:

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

      理所当然,superView 在 addSubview: 上保留了 subView,所以在删除 subView 时它会释放。

      【讨论】:

      • P.S.链接末尾的冒号是必需的。
      • +1 用于回答问题,但您写的是“确实如此”。有什么作用?它有什么作用?我糊涂了! (使用答案文本下方的“编辑”链接编辑您的答案)。
      • 哇,只有一年多的答案,比提出的问题晚了一点,而且确实得到了回答! Scraimer 我认为 Jason 对“addSubview 增加保留计数吗?”的问题说“确实如此”。随着自动引用计数的出现,这一切都不再重要了。 :p
      • 是的,“确实如此”是针对“addSubview 是否增加保留计数?”的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多