Objective-C:将属性引用传递给方法调用的正确方法

时间:2012-10-06 13:31:51

标签: objective-c ios macos cocoa

如果我有这样的财产:

@property(strong, readwrite, nonatomic) NSDate* aProperty;

我希望将引用传递给另一个方法,这些是正确的:

if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...

3 个答案:

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

(以上是真的,除非你真的想传递一个指向属性本身的指针 - 修改指向属性本身的指针,在这种情况下我会质疑你的设计)