将自动释放字符串分配给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
具有保留属性。
答案 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