【问题标题】:Multiple questions regarding retain count in objective c [duplicate]关于目标c中保留计数的多个问题[重复]
【发布时间】:2013-03-19 23:58:39
【问题描述】:

这是我的代码。

- (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 进行操作,如图所示。 我也收到内存警告,我的应用程序崩溃了。

【问题讨论】:

  • 尝试继承UIImageView并覆盖retain(不要忘记[super retain])并在这个方法中设置断点,看看它什么时候retain。
  • @KenThomases:你确定吗?我不这么认为。它是 iOS 开发中一个非常基本且重要的概念
  • @Yogi 是的,他很确定,而且我确信这对开发人员来说毫无用处。您应该关心的是“相对保留计数”(意味着平衡您的保留与发布),而不是 retainCount 返回的“绝对保留计数”。
  • (如果你希望看到retain cnt 1=2,retain cnt 2=1,这与内部API工作有关)这是我们应该使用内存管理规则的原因,我们应该释放我们唯一拥有的对象

标签: iphone ios objective-c ipad retaincount


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    回答您的问题:

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

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

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

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

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

    HTH

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多