【问题标题】:Objective-c - Retain Count when I change View go to zeroObjective-c - 当我将视图更改为零时保留计数
【发布时间】:2011-05-22 11:14:18
【问题描述】:

我在一个视图控制器中声明了一个 UIImage 和一个 UIImage 视图,如下所示:

在.h文件中:

UIImageView* itemImageView;
UIImage* itemImage;

@property (nonatomic, retain) UIImage* itemImage;
@property (nonatomic, retain) UIImageView* itemImageView;

.m 文件中:

@synthesize itemImage, itemImageView;

在另一个视图中,我设置了它的值:

UIImage *image = [UIImage imageNamed:@"name1.png"];
imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
imgView.itemImageView.image = image;

[self.parentViewController.view addSubview:imgView.itemImageView];
[self dismissModalViewControllerAnimated:YES];  

在这个方法中,itemImageView的retain count是2。

但是当我回到放置属性和合成的视图时,保留计数为 0,我无法访问该对象。

知道发生了什么吗?

【问题讨论】:

    标签: iphone objective-c sdk retaincount


    【解决方案1】:

    你的问题在于这一行:

    [self.parentViewController.view addSubview:imgView.itemImageView];
    

    这很可能应该这样编辑:

    [self.parentViewController.view addSubview:self.parentViewController.itemImageView];
    

    这就引出了imgView是否真的等同于parentViewController.view的问题。如果你想要它,那么你需要弄清楚它被分配到哪里,看看你在哪里搞砸了。如果没有,那么在分配它之前,除了一个临时容器来构建你的对象之外,没有任何意义。

    编辑:内存泄漏是一个单独的问题,是的,但我不确定你是如何在方法中声明 imgView 所以我把它留给你解决:)

    【讨论】:

      【解决方案2】:
      UIImageView* itemImageView;
      ...
      @property (nonatomic, retain) UIImageView* itemImageView;
      ...
      imgView.itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
      

      这会导致双重保留,因为 alloc 将保留计数器增加 1,@propertyretain 设置也是如此。

      设置属性的一般模式如下:

      .h:

      SomeClass* someClass;
      ...
      @property (nonatomic, retain) SomeClass* someClass;
      

      .m:

      SomeClass* temporarySomeClass = [[SomeClass alloc] init];
      self.someClass = temporarySomeClass;
      [temporarySomeClass release];
      ...
      

      在这里,我们使用一个临时变量来保存我们分配的对象,然后立即释放。

      您肯定会在 Apple 示例代码中看到这一点。

      【讨论】:

        【解决方案3】:

        您的代码看起来不错。 (除了内存泄漏)您将保留计数 +1 的 ImageView 分配给 itemImageView,这会将其增加到两个。将 ImageView 设置为 itemImageView 后,您需要在 ImageView 上调用 release:

        UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 82, 166)];
        imgView.itemImageView = iv;
        [iv release];
        

        但是,这并不能解决您的问题(它甚至会使情况变得更糟..) 你能显示更多代码吗?您是否尝试过使用调试器单步执行?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-31
          • 2014-09-02
          • 2017-02-05
          • 1970-01-01
          • 2013-02-18
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多