代码之家  ›  专栏  ›  技术社区  ›  Thomas Clayson

addSubview increment是否保留计数?

  •  6
  • Thomas Clayson  · 技术社区  · 14 年前

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

    所以每次我做这样的事:

    UIView *theView = [[[UIView alloc] initWithFrame:(CGRect)aFrame] autorelease];
    [self.view addSubview:theView];
    

    我真的在泄露记忆吗?

    @property (nonatomic, retain) UILabel *ingredientsTextLabel; 我在其中实例化的 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!
    

    ingredientsTextLabel ,但是retain count是2,所以在添加subview之后是否还需要释放I

    3 回复  |  直到 14 年前
        1
  •  10
  •   Felix    14 年前

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

        2
  •  3
  •   bbum    14 年前

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

    你应该打电话 release 与导致对象被保留的次数完全相同。不会少(除非你喜欢泄密),当然也不会多(除非你喜欢撞车)。

    Memory Management Guidelines 详细情况。

    如果+new/+alloc/-retain/-copy(NARC)对象,则需要平衡retain和release(或autorelease)。故事结束了。绝对保留计数,特别是框架类的子类实例的绝对保留计数 和/或 传递到框架代码中,是一个实现细节,很可能不是您认为的那样。

        3
  •  2
  •   Jason Lee    13 年前

    你可以在 http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/addSubview :

    当然,超级视图保留addSubview:上的子视图,因此在删除子视图时会释放它。

    推荐文章