3

私は、Objective C のクラス拡張は単なる無名のカテゴリであるという印象を受けました。ただし、これらのクラス拡張にプロパティを追加することはできますが、これはカテゴリでは不可能であるため、少し混乱しています。

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end

クラス拡張機能はどのように実装されていますか? カテゴリーとして?では、なぜ iVar を追加できるのでしょうか? クラス拡張機能がクラスに追加されるのは、コンパイル時またはクラスのロード時ですか?

4

1 に答える 1

3

クラス拡張機能は、インスタンス変数のサブセット、宣言されたプロパティ、および宣言され@interfaceたメソッドを特定の翻訳単位 (たとえば、パブリック ヘッダー ファイルから実装ファイル) にオフセットできるコンパイラ メカニズムです。公開されているはずです。ランタイムの観点からは、拡張機能は存在しません。クラス拡張機能で宣言されているものはすべて、プリンシパル クラスにマージされます。@implementationこれは、プリンシパル クラスとその拡張機能の両方に1 つあるという事実から推測できるように、拡張機能は (カテゴリではなく) プリンシパル クラスに沿ってコンパイルする必要があることを意味します。それはすべて同じクラスの一部です。

ご覧のとおり、クラス拡張はカテゴリとはまったく異なります。カテゴリはインスタンス変数を宣言できません。カテゴリは、プリンシパル クラス (ライブラリで宣言および実装されたクラスを含む) を実装するファイルとは異なる実装ファイルに存在でき、独自の@implementation. さらに、カテゴリはランタイムによって明示的にロードされ、プリンシパル クラスにアタッチされます。

于 2013-06-19T12:41:58.023 に答える