我应该发布@property(非原子,复制)吗?

时间:2011-03-08 15:55:47

标签: iphone objective-c memory-management

我正在使用UISearchBar,其中一个属性text声明如下:

摘要:当前或起始搜索文本 声明@property(nonatomic, copy) NSString *text;

我知道规则是发布您使用+alloc+new-copy的内容。

我做了:

NSString *searchText = searchBar.text;

[searchText release];

我收到了一条很好的EXC_BAD_ACCESS消息。当我删除了释放行时,EXC_BAD_ACCESS消息停止显示,因此我认为它是错误来源。

问题:我不应该发布searchText,因为它来自使用副本的属性吗?

3 个答案:

答案 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];
  }
}