objective-c:不允许双指针指向属性?

标签 objective-c cocoa

我想创建一个这样的方法:

- (void) checkAndUpdateStringProperty: (NSString **) property{
   if (...) 
      *property = @"whatever";
}

我想用它来传递同一个类的属性:

- (void) somewhereElse{
       ....
       [self checkAndUpdateStringProperty: &self.productName];
}

但这给出了一个语法错误,说“请求的属性表达式的地址”。有什么理由吗?如果我用局部变量替换类属性,它工作正常:

- (void) somewhereElse{
       NSString *name = nil;
       [self checkAndUpdateStringProperty: &name];
}

最佳答案

属性应该只能通过它们的 getter 和 setter 方法访问,除了在对象的 initdealloc 方法中初始化和取消初始化它们(当对象是不处于完全一致的状态)——以任何其他方式访问它们会破坏它们的目的并且不尊重它们的属性(retaincopy 等)。

之所以编译不通过,是因为属性访问器是方法调用的语法糖,你不能取方法返回值的地址。 self.productName[self productName] 相同,&[self productName] 没有意义。

如果你真的想这样做,不要用一个属性来做,只用一个常规变量(比如局部变量或 ivar),然后记录你的语义函数:调用函数是否需要释放返回的对象?等等。例如,采用 NSError** 的各种 Apple 方法指定返回的错误对象(如果有的话)是自动释放的对象,因此您不应该 release 除非您还保留它。

关于objective-c:不允许双指针指向属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616147/

相关文章:

ios - 触摸开始 : withEvent: is not called when tapped on a UIButton

ios - 将NSString附加到NSArray时仅获取一个值

iOS : Repositioning UIGraphicsBeginImageContext and UIImageView

objective-c - 复制自定义类对象

Objective-C:检查 OSX 中的防火墙状态?

objective-c - 如何创建 Cocoa GUI 来编辑 NSDate 对象数组?

objective-c - NSArray 创建子数组,然后对值求和

objective-c - 为什么在从 Google Data Objective-C Client Library 子类化 GDataEntryBase 时会出现 "unrecognized selector"错误?

objective-c - 为什么 usleep 不起作用?

cocoa - 界面生成器错误: IBXMLDecoder: The value for key is too large to fit into a 32 bit integer