【问题标题】:How to handle memory management with an autoreleased NSString that is assigned to an IBOutlet如何使用分配给 IBOutlet 的自动释放 NSString 处理内存管理
【发布时间】:2010-12-02 04:47:29
【问题描述】:

当自动释放字符串分配给 IBOutlet 属性时,它会被保留吗?比如说我有一个财产

@property(nonatomic, retain) IBOutlet UILabel *lblName;

现在在我的viewWillAppear 中,我将lblName 分配为:

lblName = [NSString stringWithFormat: @"NameString"];

那么这个字符串的保留计数是多少,我是否需要确保在每次添加视图或调用viewWillAppear 时分配一个新字符串之前分配lblName = nil;

还有一个问题是关于UIImageView

@property(nonatomic, retain) IBOutlet UIImageView *imgView;

现在当我使用动画时

NSMutableArray *imageArray = [[NSMutableArray alloc] init];

//some images are added to imageArray

imgView.animationImages = imageArray //NSMutableArray of autoreleased images.

[imageArray release];

是保留该数组中的图像还是保留该数组,因为imgView 具有保留属性。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    我知道这是一篇旧帖子,但我偶然发现了它,并想为其他可能做同样事情的人添加一些细节。

    检查已分配对象的保留计数的一个好方法是使用 Instruments 应用程序并运行对象分配。您可以通过转到产品菜单 (Xcode 4.o) 并选择配置文件来执行此操作。这将启动仪器。选择 Allocations 作为您的跟踪模板。它位于左侧的 Memory 类别下。

    如果您对此不熟悉,我相信您会开始发现它很有帮助。您可以使用您的设备或模拟器运行它。全部启动后,向下滚动对象分配列表。你会发现诸如 UIImage、UIImageView、UIScrollView 之类的东西,这些对象中的每一个都会计算它被创建的次数以及分配了多少活对象。只需使用您的应用程序并密切关注数字。您将能够在测试时查看您的对象是被释放还是分配。

    如果您将鼠标悬停在您感兴趣的对象上,您会看到一个小的侧箭头按钮出现。单击以获取有关发送到对象的 malloc 和 free 命令的一些详细信息。您还可以查看有多少内存是 malloc 或空闲的。如果您展开屏幕一侧的详细信息,您还可以看到堆栈。

    因此,如果您不熟悉此工具,请务必检查一下。如果您遇到内存问题或对对象的保留有疑问,可以在这里进行全面检查。

    一切顺利 - fxshot

    【讨论】:

      【解决方案2】:

      我相信你的意思是: iblName.text = [NSString stringWithFormat:@"NameString"];

      stringWithFormat: 将返回一个自动释放的字符串,因此保留计数从 1 开始,将其分配给 text 属性也会增加它,但是,由于它是自动释放的,它会在下次运行循环耗尽时回到 1自动释放池。

      当你设置它时,标签会释放字符串并保留新的,所以你应该没问题。

      第二种情况,数组会保留自动释放的图片,设置animationImages会保留数组。

      【讨论】:

      • 对不起,我没有告诉你有关阵列版本的信息。比如我是否需要再释放一次 imageArray,是否还需要释放自动释放的图像。
      【解决方案3】:

      当使用带有retain 属性的属性时,不要使用简单赋值。

      您需要执行以下操作:

      @property(nonatomic, retain) NSString *someString;
      @synthesize someString;
      
      -(void)someMethod
      {
          // either this
          [self setSomeString:@"Oh hai!"];
      
          // or this
          self.someString = @"Oh hai!";
      
          // but never this
          someString = @"Oh hai!";
      }
      

      前两个版本调用方法setSomeString:,但第三个没有。它只是将@"Oh hai!" 的指针分配给实例变量someString。这是一个问题,因为它不会调用 [someString retain] 但是 完成后,它将调用 release 并导致发生异常,因为您释放它的次数超过了保留的次数(因为它分配时未保留)。

      有关 iPhone 内存管理的更多信息,请查看this.

      顺便说一句,IBOutlet 宏实际上计算为一个空宏。它仅由 Interface Builder 用于将属性标记为在 NIB 中可用。

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多