如果我有这样的财产:
@property(strong, readwrite, nonatomic) NSDate* aProperty;
我想将引用传递给另一种方法,这些是否正确:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
如果我有这样的财产:
@property(strong, readwrite, nonatomic) NSDate* aProperty;
我想将引用传递给另一种方法,这些是否正确:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
您可以使用 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]];
}
我更喜欢使用键值编码。
考虑到你的例子:
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;
aProperty
已经是指向 NSDate 对象的指针,因此您只需将指针值传递给“通过引用调用”。
由于项目被声明为指针,您可以使用以下方式传递引用,
if([AnotherClass aMethod:aProperty]) { ...
aMethod 的原型在哪里...
- (BOOL) aMethod:(NSDate *) aParameter;
(以上是真的,除非你真的想传递一个指向属性本身的指针 - 修改指向属性本身的指针,在这种情况下我会质疑你的设计)