[iOS8] NSObjectに新プロパティ4つ

2014年9月22日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

iOS8ではNSObjectに4つのプロパティが新規に追加された。

NSObject.h
@property (readonly) NSUInteger hash;

@property (readonly) Class superclass;
 :
@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;

正確に言うと情報が増えたわけではなく、従来メソッドだったものが readonlyプロパティに変更された。

iOS7の時はこんな感じ。
- (NSUInteger)hash;

- (Class)superclass;
 :
- (NSString *)description;
@optional
- (NSString *)debugDescription;


通常は問題にならないが class_copyPropertyList()を使っていると話が違ってくる。iOS7までは含まれなかったこれらのプロパティが取得できることに注意が必要となる。自分の場合、iOS7の時にエンコードして作成したアーカイブファイルを iOS8でデコードする時にこれが原因で失敗した。
最初はアーカイブの互換性が無くなったかと思い少々びっくりしたが。

アプリで使っていたライブラリ(自作)はこれ。


class_copyPropertyList()でプロパティ名を取得して、それを使ってNSCoding準拠のエンコード/デコードを行うライブラリ。class_copyPropertyList()で hash/superclass/description/debugDescriptionと予期しないプロパティ(しかもreadonly)を拾ってきたことが原因でデコードに失敗していた。対処としてはクラスが NSObjectの場合はclass_copyPropertyList()で拾ってきたプロパティを無視するようにした。対処としてはこの4つのプロパティ名が来た時は無視するようにした。

(補足)とは言っても class_copyPropertyList()を単純に呼び出しても自クラスで定義したプロパティしか返らない。再帰的に親クラスへ遡って NSObjectに到達するケースのみが問題になりうる。LKCodingObjectはまさにそのケース。最新版(1.3.1)では既にこの問題は対応済み。
→ どうもそうではないようだ。


(参考)
Retrieving property list of a class in iOS

NSObject has some "new" properties in iOS 8

Responses

Leave a Response

人気の投稿(過去 30日間)