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

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

我想使用它来传递同一类的属性:
- (void) somewhereElse{
       ....
       [self checkAndUpdateStringProperty: &self.productName];
}

但这给出了一个语法错误,说“请求的属性表达式的地址”。有什么原因吗?如果我将class属性替换为局部变量,则可以正常工作:
- (void) somewhereElse{
       NSString *name = nil;
       [self checkAndUpdateStringProperty: &name];
}

最佳答案

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

它之所以无法编译,是因为属性访问器是方法调用的语法糖,并且您无法获取方法返回值的地址。 self.productName[self productName]相同,而&[self productName]毫无意义。

如果您确实要执行此操作,请不要对属性进行操作,而仅对常规变量(例如局部变量或ivar)进行处理,并记录函数的语义:调用函数是否需要release返回的对象?等等,例如,各种采用NSError**的Apple方法都指定返回的错误对象(如果有的话)是自动释放的对象,因此除非您也对其进行release编码,否则不要自己对其进行retain编码。

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

10-12 00:09
查看更多