我想创建一个这样的方法:
- (void) checkAndUpdateStringProperty: (NSString **) property{
if (...)
*property = @"whatever";
}
我想用它来传递同一个类的属性:
- (void) somewhereElse{
....
[self checkAndUpdateStringProperty: &self.productName];
}
但这给出了一个语法错误,说“请求的属性表达式的地址”。有什么理由吗?如果我用局部变量替换类属性,它工作正常:
- (void) somewhereElse{
NSString *name = nil;
[self checkAndUpdateStringProperty: &name];
}
最佳答案
属性应该只能通过它们的 getter 和 setter 方法访问,除了在对象的 init
和 dealloc
方法中初始化和取消初始化它们(当对象是不处于完全一致的状态)——以任何其他方式访问它们会破坏它们的目的并且不尊重它们的属性(retain
、copy
等)。
之所以编译不通过,是因为属性访问器是方法调用的语法糖,你不能取方法返回值的地址。 self.productName
与 [self productName]
相同,&[self productName]
没有意义。
如果你真的想这样做,不要用一个属性来做,只用一个常规变量(比如局部变量或 ivar),然后记录你的语义函数:调用函数是否需要释放
返回的对象?等等。例如,采用 NSError**
的各种 Apple 方法指定返回的错误对象(如果有的话)是自动释放的对象,因此您不应该 release
除非您还保留
它。
关于objective-c:不允许双指针指向属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616147/