问题
我遇到了一个有趣的问题,但找不到任何关于它的文档...有时properties
在 a 中声明的protocol
未在符合该规则的特定类中实现,protocol
并且发生运行时异常。定义是否dynamic property
在某些奇怪的情况下被优化掉了?不能protocols
与properties
那个被声明的人一起使用dynamic
吗?对此的任何见解将不胜感激。
以下是更多细节。
给定一个protocol
:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) id someProperty;
@end
和一个实现类似的类protocol
:
@interface MyClass <MyProtocol>
@end
@implementation MyClass
@dynamic someProperty;
@end
我注意到有时我无法通过电话获得任何信息
class_getProperty(myClass, propertyName);
为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
然后你跑
const char *name = [@"someData" UTF8String];
objc_property_t property = class_getProperty([MyObject class], name);
const char *attributes = property_getAttributes(property);
property
即使property
不存在,您也会获得元数据。换句话说,您不需要综合属性来获取它的 attributes。运行时仍然知道它。自己试试吧。问题是有时这不会发生。我想知道导致运行时不知道property
属性的条件。
临时修复
我的临时解决方法是复制.h 文件property
中的所有定义protocol
并将它们粘贴到 .h 文件中:
@interface MyClass <MyProtocol>
@property (nonatomic, strong) id someProperty;
@end
@implementation MyClass
@dynamic someProperty;
@end
这运行良好,尽管它远非理想。但是,它表明我的代码工作正常,问题出在其他地方。
如果需要,我很乐意提供更多细节或背景。