objc:具有 NSString 的强属性
Posted
技术标签:
【中文标题】objc:具有 NSString 的强属性【英文标题】:objc: strong property with NSString 【发布时间】:2013-05-20 03:10:52 【问题描述】:我声明一个强属性:
@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;
所以我认为属性综合会为我添加副本/保留。 这就是让我感到困惑的原因!
【问题讨论】:
【参考方案1】:负引用计数不平衡在于未发布的代码。
这个变种是错误的:
self.message = [[NSString stringWithFormat:@"xxxx %@",sth] copy];
-- 这只是引入了正引用计数不平衡(标志性副作用:泄漏的对象)。
首先,修复所有分析器警告。如果这不能解决问题,请运行 Instruments。可以记录每个对象的引用计数操作:Debugging the EXEC_BAD_ACCESS on Iphone using Performance Tool, Allocations
注意哪一个不能解决问题:您应该为您的NSString
属性使用copy
而不是strong
。
【讨论】:
【参考方案2】:在第一种情况下,您尝试在 alloc 方法中实例化字符串对象之前使用 setter 方法设置字符串。
确保在 alloc 方法中实例化 String 对象。
在第二种情况下,您将复制的对象分配给属性。这就是您看不到错误的原因。
【讨论】:
以上是关于objc:具有 NSString 的强属性的主要内容,如果未能解决你的问题,请参考以下文章
ObjC / iOS:NSCFString 不是 NSString?
CocoaPods 库中的强 dispatch_queue_t