如果我有这样的财产:
@property(strong, readwrite, nonatomic) NSDate* aProperty;
我希望将引用传递给另一个方法,这些是正确的:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
答案 0 :(得分:10)
您可以使用KeyValue编码。
只需将属性名称作为NSString发送
- (void) method:(NSString*)propertyName
{
[self setValue:[NSNumber numberWithInt:2] forKey:propertyName];
}
属性也只是方法(set和get),所以你可以传递一个选择器
SEL selector = @selector(setProperty:);
- (void) method:(SEL)selector target:(id)target
{
[target performSelector:selector withObject:[NSNumber numberWithInt:2]];
}
我更喜欢使用键值编码。
答案 1 :(得分:9)
考虑你的例子:
if ([AnotherClass aMethod:&(self.aProperty)]) { ...
这显然不起作用,因为点符号实际上是使用getter访问器方法。它相当于:
if ([AnotherClass aMethod:&[self aProperty]]) { ...
您可以很容易地想象为什么编译器对这种表示法有点困惑。合乎逻辑的选择是参考ivar。因此,(假设您正在使用属性的ivar的下划线约定),它可能看起来像:
if ([AnotherClass aMethod:&_aProperty]) { ...
但是这有各种各样的问题(绕过setter,有aMethod
需要__strong
属性的问题覆盖默认的__autoreleasing
,如讨论here,等等。
所以,最好的,只需要一个接收更新的局部变量,然后在之后调用属性的setter:
NSDate *date;
if ([AnotherClass aMethod:&date]) { ...
self.aProperty = date;
答案 2 :(得分:2)
aProperty
已经是指向NSDate对象的指针,因此您只需将指针值传递给“按引用调用”。
当项目被声明为指针时,您可以使用
传递引用if([AnotherClass aMethod:aProperty]) { ...
aMethod的原型是......
- (BOOL) aMethod:(NSDate *) aParameter;
(以上是真的,除非你真的想传递一个指向属性本身的指针 - 修改指向属性本身的指针,在这种情况下我会质疑你的设计)