2015-03-13 91 views
0

我有一个问题similar to this one,但我很想知道是否有任何方法(编译器标志,@ -directive等)让类在编译时考虑@dynamic的所有可能的属性,以便您可以编码针对任意任意属性,而不必将其明确声明为@dynamic。是否有可能在Objective-C中创建@dynamic所有可能的属性?

例如我可能只是这样做:

myObject.anyPropertyName = someObject; 

...就像你可以在JavaScript中做,而不必申报@dynamic anyPropertyName

+1

我不明白你问的问题与你关联的问题不同。你能澄清吗? – 2015-03-13 18:54:15

+0

具体而言,我希望我能够使用任何有效的标识符作为点符号属性访问权限,而不必先在类上动态调用它,然后将该调用变为重写的setValue:forKey方法。类。 – devios1 2015-03-13 21:21:57

+1

iOS开发学习中的“一切应该是动态的,并且在运行时始终”。 :)看起来很诱人,但是你会失去编译器检查类型和逻辑的能力。在实践中,尽可能地依靠编译器来审查代码,同时在应用程序中编写任何类型的目标构建动态作为算法 - 可以通过代码进行验证。 – bbum 2015-03-15 17:20:06

回答

4

你想要什么是不可能的。编译器不会让你发送任何消息而没有在之前声明该选择器。这当然包括访问属性。这是必要的,因此编译器可以知道需要什么类型 - 并非所有东西都是对象。编译器必须为对象(想到ARC),结构或标量生成不同的代码。

另一方面,运行时会很乐意在不声明这些属性的情况下处理这个问题。但那么你的工作就是把正确的变种objc_msgSend转换成正确的签名。这当然需要比直接使用valueForKey:setValue:forKey:更加丑陋的代码。

另外@dynamic实际上并没有什么关系。所有@dynamic都会关闭编译器关于getter和setter的缺失实现,并阻止它自动生成它们。这是向编译器保证在运行时会处理这些消息的一种方式。使用@dynamic不会自动将属性访问转发给valueForKey:和setValue:forKey :.

+0

我没想到这是可能的,但我一直在寻找更动态的方法。 ;)我意识到它不会转发,但它确实允许您使用标识符作为属性访问器,而不必在编译时实际定义属性访问器本身,所以我认为这可能是一小步,想知道是否有方法将其作为课程的默认设置。不管怎样,谢谢。 – devios1 2015-03-13 22:31:39

相关问题