我正在使用UISearchBar
,其中一个属性text
声明如下:
摘要:当前或起始搜索文本
声明:@property(nonatomic, copy) NSString *text;
我知道规则是发布您使用+alloc
,+new
或-copy
的内容。
我做了:
NSString *searchText = searchBar.text;
和
[searchText release];
我收到了一条很好的EXC_BAD_ACCESS
消息。当我删除了释放行时,EXC_BAD_ACCESS
消息停止显示,因此我认为它是错误来源。
问题:我不应该发布searchText
,因为它来自使用副本的属性吗?
答案 0 :(得分:8)
不,你不应该在这里使用release。在这种情况下,“副本”指的是如何实现setter,而不是getter。您所做的调用(-text
)不包含“复制”一词,因此您不应该发布结果。
答案 1 :(得分:2)
属性的copy属性表示在分配到实例变量之前复制对象。当您访问此属性时,您将获得对所创建副本的引用。
在搜索栏上设置文字时:
NSString* myTextString = [[NSString alloc] initWithString:@"My Text String"];
mySearchBar.text = myTextString;
[myTextString release];
答案 2 :(得分:1)
详细说明Rob Napier的正确答案:
NSString *searchText = searchBar.text;
此代码将searchBar
的text属性的引用分配给searchText
。这不是searchText
的副本,只是对NSString
对象中相同searchBar
对象的另一个引用。发布searchText
与发布searchBar.text
相同,这会导致EXC_BAD_ACCESS
消息。
在text属性的声明中,getter方法仅仅是:
- (NSString *)text {
return text;
}
更有趣的方法是setter方法。对于此声明,setter类似于:
- (Void)setText:(NSString *)newString {
if (text != newString) {
[text release];
text = [newString copy];
}
}