3

如果我有这样的财产:

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

我想将引用传递给另一种方法,这些是否正确:

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

3 回答 3

10

您可以使用 KeyValue 编码。

只需将属性名称作为 NSString 发送

- (void) method:(NSString*)propertyName
{
  [self setValue:[NSNumber numberWithInt:2] forKey:propertyName];
}

还有一个属性只是方法(设置和获取),所以你可以传递一个选择器

SEL selector = @selector(setProperty:);

- (void) method:(SEL)selector target:(id)target
{
  [target performSelector:selector withObject:[NSNumber numberWithInt:2]];
}

我更喜欢使用键值编码。

于 2012-10-06T13:39:28.857 回答
10

考虑到你的例子:

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

这显然行不通,因为点表示法实际上是使用 getter 访问器方法。它相当于:

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

你可以很容易地想象为什么编译器对这个符号有点困惑。合乎逻辑的替代方法是引用 ivar。因此,(假设您对属性的 ivar 使用下划线约定)它可能看起来像:

if ([AnotherClass aMethod:&_aProperty]) { ...

但这有各种各样的问题(绕过setter,有关于aMethod需要__strong属性来覆盖此处__autoreleasing讨论的默认值等问题)。

所以,最好的办法是有一个接收更新的局部变量,然后调用属性的设置器:

NSDate *date;
if ([AnotherClass aMethod:&date]) { ...

self.aProperty = date;
于 2012-10-06T16:07:43.083 回答
2
aProperty

已经是指向 NSDate 对象的指针,因此您只需将指针值传递给“通过引用调用”。

由于项目被声明为指针,您可以使用以下方式传递引用,

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

aMethod 的原型在哪里...

- (BOOL) aMethod:(NSDate *) aParameter;

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

于 2012-10-06T13:38:47.630 回答