objc:NSString的强大属性

时间:2013-05-20 03:10:53

标签: objective-c cocoa properties memory-leaks

我声明了一个强大的财产:

@property (strong) NSString *message;

我将消息设置为:


self.message = [NSString stringWithFormat:@"xxxx %@",sth];

但它会在消息中崩溃:

*** -[CFString retain]: message sent to deallocated instance 0x1015ea790

即使我更改了属性:strong->复制,它仍然崩溃。 现在我用它来修复它:


self.message = [[NSString stringWithFormat:@"xxxx %@",sth] copy];

但我仍然无法理解它,因为我总是在iOS中以相同的方式编写它。

顺便说一句:代码是针对cocoa,no-arc

UPDATE1:

1我添加了@synthesize message;

2 sth是一个例子,真正的代码是

self.message = [NSString stringWithFormat:@"xxxx %@", [[NSDate date] description]];

3我记得strong / copy属性的默认实现可以是:


- (void)setMessage:(NSString*)newMsg
{
   if (message != newMsg)
   {
        [newMsg retain];
        [message release];
        message = newMsg;
   }
}

所以我认为属性合成会为我添加副本/保留。 这就是让我困惑的原因!

2 个答案:

答案 0 :(得分:2)

负引用计数不平衡在于尚未发布的代码。

这种变体是错误的:

self.message = [[NSString stringWithFormat:@"xxxx %@",sth] copy];

- 这只是引入了一个正参考计数不平衡(标志性副作用:泄漏的对象)。

首先,修复所有分析仪警告。如果这不能解决问题,那么请运行Instruments。它可以记录每个对象的引用计数操作:Debugging the EXEC_BAD_ACCESS on Iphone using Performance Tool, Allocations

注意哪些问题无法解决问题:您应该使用copy代替NSString属性,而不是strong

答案 1 :(得分:0)

在第一种情况下,您尝试在使用alloc方法实例化字符串对象之前使用setter方法设置字符串。

确保在alloc方法中实例化String对象。

在第二种情况下,您要将复制的对象分配给属性。这就是为什么你没有看到错误。