如何使用分配给IBOutlet的自动释放的NSString处理内存管理

时间:2009-09-29 02:58:00

标签: iphone objective-c cocoa-touch

将自动释放字符串分配给IBOutlet属性时,是否保留。比如让我说我有一个属性

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

现在我的viewWillAppear我将lblName字符串指定为:

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

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

另一个问题是关于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具有保留属性。

3 个答案:

答案 0 :(得分:0)

使用具有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中可用。

答案 1 :(得分:0)

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

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

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

在第二种情况下,数组将保留自动释放的图像,设置animationImages将保留数组。

答案 2 :(得分:0)

我知道这是一篇很老的帖子,但我遇到了它,并希望为其他可能会做同样事情的人添加一些细节。

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

如果您对此不熟悉,我相信您会发现它非常有帮助。您可以使用您的设备或模拟器运行此程序。全部启动后,向下滚动对象分配列表。你会发现像UIImage,UIImageView,UIScrollView这样的东西,每个对象都会计算它创建的次数以及分配了多少个生命对象。只需使用您的应用程序并密切关注数字。在测试时,您将能够看到对象是否是dealloc或alloc。

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

因此,如果您不熟悉此工具,请务必查看。如果您遇到内存问题或有关保留对象的问题,可以在此处查看。

一切顺利 - fxshot