Chr*_*her 7 objective-c objective-c-runtime ios
我遇到了一个有趣的问题,并且无法在其上找到任何文档... 有时properties在a protocol中声明的未在符合该类的特定类中实现,protocol并且发生运行时异常.dynamic property在一些奇怪的情况下,定义是否被优化?不能protocols用于properties宣布dynamic?任何对此的见解将不胜感激.
以下是一些更多细节.
鉴于protocol:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
和一个实现protocol类似的类:
@interface MyClass <MyProtocol>
@end
@implementation MyClass
@dynamic someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
我注意到有时我无法从呼叫中获取任何信息
class_getProperty(myClass, propertyName);
Run Code Online (Sandbox Code Playgroud)
对于properties中protocol.这只发生在某些类中,似乎是零星的.
我正在运行最新的Xcode 4并链接到iOS 6 SDK.我确实在同一台机器上安装了预发布的Xcode 5,虽然它不是默认的(通过xcode-select).
如果您运行此代码:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someData;
@end
@interface MyObject : NSObject <MyProtocol>
@end
@implementation MyObject
@dynamic someData;
@end
Run Code Online (Sandbox Code Playgroud)
然后你跑
const char *name = [@"someData" UTF8String];
objc_property_t property = class_getProperty([MyObject class], name);
const char *attributes = property_getAttributes(property);
Run Code Online (Sandbox Code Playgroud)
property即使property不存在,您也会获得元数据.换句话说,您不需要合成属性来获取它的属性.运行时仍然知道它.亲自试试吧.问题是有时这不会发生.我想知道导致运行时不知道property属性的条件.
我的临时修复是复制所有property定义protocol并将它们粘贴到.h文件中:
@interface MyClass <MyProtocol>
@property (nonatomic, strong) id someProperty;
@end
@implementation MyClass
@dynamic someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
这很好,虽然它远非理想.但是,它表明我的代码工作正常,问题出在其他地方.
如果需要,我很乐意提供更多细节或背景信息.
似乎有一个混乱:
声明一个属性足以让该属性在运行时存在。没有必要执行。这就是 Objective-C 的工作原理。方法不必在编译时存在,您可以动态添加它们(例如 Core Data 所做的)。
@dynamic在运行时绝对不执行任何操作。在编译时,它是一个占位符,表示“不要向我发出编译器警告,说明此处未定义 getter/setter”。在最新的 LLVM 上,它还说“不要自动合成”。
我的建议:
如果您通过类别添加协议,请确保该类别已加载。这似乎是运行时反射最常见的问题。
要调试,也尝试使用class_conformsToProtocol. 拥有一个符合协议但没有协议声明的属性的类会很奇怪。