目标c中的动态属性

时间:2011-09-29 04:15:57

标签: objective-c

我发现Objective-C对象属性可以标记为@dynamic,让编译器知道实现在运行时可用。我想知道是否有办法告诉编译器对象的所有属性都是动态的,而不是逐个明确地指定它们(我没有预先列出的属性)。我知道如果我只使用[object something]这不会有问题,但出于文体目的,我想使用object.something语法。

我很确定这样做是不可能的,但我希望有人确认一下。由于这不适用于生产,因此解决方案可能涉及您可以想象的任何事情。

感谢。

其他信息:

  • 我只关心-something(getter)工作,所以如果你的解决方案不支持设置好的话。

示例:

@interface MagicalClass : NSObject
// property 'something' is not defined!
@end

@implementation MagicalClass
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { ... }
- (void)forwardInvocation:(NSInvocation *)anInvocation { ... }
@end

MagicalClass *obj = [[MagicalClass alloc] init];
[obj something]; // compiler warning
obj.something; // compiler error

3 个答案:

答案 0 :(得分:4)

这实际上不适用于声明的属性。它们的重点在于,您可以预先声明您的属性以及与它们进行交互的方式。如果您没有任何声明,那么您没有任何声明的属性。

不幸的是,它也无法使用简单消息 well ,尽管它可以比点语法更好地工作。 Objective-C的静态类型检查会抛出一系列警告,如果任何属性属于非对象类型,它可能无法生成正确的调用代码。

这种事情在Python和Ruby等语言中很常见,不需要声明事物,但它与Objective-C不能很好地融合。在Objective-C中,访问任意属性通常使用字符串(参见Key-Value CodingNSAttributedString)。

答案 1 :(得分:2)

我不相信这是可能的。如果您使用id类型,则可以发送未声明的消息,但点语法实际上依赖于了解您的特定访问者。

答案 2 :(得分:0)

我没试过,但是如果你提供了一个getter和setter,Xcode是否还需要@synthesize@dynamic指令?

因此,如果您的财产被称为something,请实施-setSomething:-something