-2

这是我的代码。

- (void)viewDidLoad{
    [super viewDidLoad];

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 240, 280)];
    [view setTag:101];
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 220, 260)];
    [view setBackgroundColor:[UIColor redColor]];
    [view addSubview:imgView];
    [self.view addSubview:view];
    [self getimageFromView:view];
    [view release];
    [imgView release];

    [self getimageFromView];
}

-(void)getimageFromView:(UIView *)view{
    for (UIView *view123 in [view subviews]) {
    if ([view123 isKindOfClass:[UIImageView class]]) {
        UIImageView *imgView = (UIImageView *)view123;
        imgView.image = [UIImage imageNamed:@"img.png"];
        NSLog(@"retain cnt 1 = %d",[imgView retainCount]);
    }
    }
}

-(void)getimageFromView{
    for (UIView *view in [self.view subviews]) {
    if (view.tag == 101) {
        for (UIView *view123 in [view subviews]) {
            if ([view123 isKindOfClass:[UIImageView class]]) {
                UIImageView *imgView = (UIImageView *)view123;
                imgView.image = [UIImage imageNamed:@"img.png"];
                NSLog(@"retain cnt 2 = %d",[imgView retainCount]);
            }
        }
    }
    }
}

nslog 如下所示

retain cnt 1 = 3
retain cnt 2 = 2

现在我的问题

1) Why UIImageView's object retain count is displayed like this ? 
2) Is that correct count ?
3) If yes how can i send the release message till it become 0 ?
4) Can I do like this ? Is this proper way ?

for(int i=0;i<[imgView retainCount];i++){
    [imageView release];
}

我有很多这样的视图,并且必须对 UIImageView 进行操作,如图所示。我也收到内存警告,我的应用程序崩溃了。

4

2 回答 2

1

的文档以retainCount“请勿使用此方法”声明开头。虽然这有点苛刻,但警告是存在的,因为很难解释其结果。

回答您的问题:

1)因为那是它当时的价值。值 3 表示在返回的那一刻,三个对象已经表达了对该对象的所有权权益,并且该所有权权益仍未完成,但这些对象可能已经表明他们希望通过发出一个取消该权益autorelease- 这是其中一个retainCount不应使用理由。

2) 计数在给出时总是正确的,但可能很难解释。

3)您永远不会尝试将计数减少到零,这与保留/释放模型完全不一致,并且会造成严重破坏或更糟。规则是,如果您创建它(使用 alloc,或名称中带有 create 或 copy 的方法)或保留它,那么您拥有所有权权益,并且必须将该所有权交给其他人或释放/自动释放该对象以取消所有权权益.

4)见3,你永远不会到这里。

您应该阅读有关保留/释放模型的文档并了解所有权。即使在 ARC 下,保留/释放是为您自动处理的,您也需要了解所有权。

高温高压

于 2013-03-29T09:54:30.150 回答
1

1) 之所以这样显示,是因为这是保留计数。
2) 是
3) 绝对不是
4) 请参阅 3 的答案

于 2013-03-29T09:51:43.640 回答