0

我声明了一个强大的属性:

@property (strong) NSString *message;

我将消息设置为:


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

但它会因消息而崩溃:

*** -[CFString retain]:消息发送到已释放实例 0x1015ea790

即使我更改了属性:strong-> copy,它仍然崩溃。现在我使用以下方法修复它:


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

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

顺便说一句:代码是可可的,无弧

更新1:

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;
   }
}

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

4

2 回答 2

2

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

这个变体是错误的:

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

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

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

请注意哪个不能解决问题:您应该使用copyfor 您的NSString财产而不是strong.

于 2013-05-20T05:06:14.513 回答
0

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

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

而在第二种情况下,您将复制的对象分配给属性。这就是您看不到错误的原因。

于 2017-02-10T21:26:11.327 回答