Objective c 目标c中的动态特性

Objective c 目标c中的动态特性,objective-c,Objective C,我发现Objective-C对象属性可以标记为@dynamic,以让编译器知道实现将在运行时可用。我想知道是否有一种方法可以告诉编译器,对象上的所有属性都是动态的,而不需要逐个显式地指定它们(我前面没有属性列表)。我知道,如果我只使用[object something],这不会是一个问题,但出于文体目的,我想使用object.something语法 我相当肯定这是不可能做到的,但我希望有人能证实这一点。由于这不是用于生产的,所以解决方案可能涉及到您可以想象到的任何内容 谢谢 其他信息: 我只关

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

我相当肯定这是不可能做到的,但我希望有人能证实这一点。由于这不是用于生产的,所以解决方案可能涉及到您可以想象到的任何内容

谢谢

其他信息:

  • 我只关心
    -某些东西(getter)是否正常工作,因此,如果您的解决方案不支持setter,那么这很好
例如:

@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

我没有尝试过这个,但是如果您提供了getter和setter,Xcode是否仍然需要
@synthesis
@dynamic
指令


因此,如果您的属性名为
something
,请实现
-setSomething:
-something
我认为这是不可能的。如果您使用
id
类型,您可能可以发送未声明的消息,但dot语法实际上依赖于了解特定的访问器。

这实际上不适用于声明的属性。它们的全部要点是,您预先声明了您的属性是什么以及如何与它们交互。如果没有任何要声明的属性,那么就没有任何已声明的属性

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


这种情况在Python和Ruby等语言中很常见,在这些语言中,不必声明内容,但它与Objective-C的关系不太好。在Objective-C中,访问任意属性通常是通过字符串完成的(参见和).

不能这样做,因为我想在运行时使用forwardInvocation及其朋友实现
-setSomething:
-something
。如果您“事先没有属性列表”,如何声明它们?比如,
@synthesis
@dynamic
告诉编译器该属性将如何实现,但是您是如何声明这些属性存在的呢?这是我的问题。我不想申报财产。在这种特殊情况下,我希望编译器信任我,因为我希望动态地实现它们(只针对这个类)。这就是我所能做到的。我仍然不明白为什么会这样做,因为点语法可以翻译成消息传递风格。我只是有点惊讶,不可能让编译器知道我知道我在做什么。(已经有了对此的运行时支持)