問題
興味深い問題に遭遇しましたが、それに関するドキュメントを見つけることができませんでした... で宣言properties
された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-select経由)、プレリリースのXcode 5を同じマシンにインストールしています。
例
このコードを実行すると:
@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
つまり、属性を取得するためにプロパティを合成する必要はありません。ランタイムはまだそれを認識しています。自分で試してみてください。問題は、これが起こらない場合があることです。property
ランタイムが属性を認識しない原因となる条件を知りたいです。
一時的な修正
私の一時的な修正は、すべてのproperty
定義をコピーprotocol
して .h ファイルに貼り付けることです。
@interface MyClass <MyProtocol>
@property (nonatomic, strong) id someProperty;
@end
@implementation MyClass
@dynamic someProperty;
@end
理想からは程遠いですが、これは問題なく動作します。ただし、コードが正しく機能しており、問題が別の場所にあることを示唆しています。
必要に応じて、詳細や背景をお知らせいただければ幸いです。