我声明了一个强大的财产:
@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;
}
}
所以我认为属性合成会为我添加副本/保留。 这就是让我困惑的原因!
答案 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对象。
在第二种情况下,您要将复制的对象分配给属性。这就是为什么你没有看到错误。