1

保持はNSObjectプロトコルで宣言されています。

したがって、NSObjectクラスとNSProxyクラスがそれを実装します。

ただし、NSProxyクラスとNSObjectクラスの両方に割り当てがあります。

NSObjectプロトコルでallocが宣言されていないのはなぜですか?

副次的な質問:NSObjectプロトコルは、メソッドのクラスバージョンを格納するためにも使用されますが、インスタンスメソッドはNSObjectクラスにあります。NSObjectプロトコルで宣言されているクラスとインスタンスの両方を停止するものはありますか。なぜそれらを分割するのですか?

@protocol NSCopying

- (id)copyWithZone:(NSZone *)zone;     //INSTANCE METHOD version of copyWithZone

@end
@interface NSObject <NSObject> {
    Class   isa;
}
...

+ (id)copyWithZone:(NSZone *)zone;     //CLASS METHOD version of copyWithZone

乾杯

4

1 に答える 1

2

これは、Objective-C が何を必要としているか、実装が何を必要としているかによって決まると思います。

オブジェクトを作成するには、それを割り当てる方法が必要です。これはallocメソッドによって行われます。これは Objective-C を使用するために必要であるため、すべてのルート オブジェクトがそれを実装する必要があることを意味します。ただし、メモリ管理は参照カウントによって行う必要はありません。代わりにガベージ コレクションを使用できます。このため、retainメソッドは目的 c を使用する必要はありません。Apple の実装retainでは、メモリ管理の形式としてメソッドが作成されました。彼らは、すべてのオブジェクトが利用できるようにしたかったので、NSObject プロトコルに追加しました。Cocoa のすべてのルート クラスはそのプロトコルに準拠することになっているため、すべてretainメソッドを持つ必要があります。

クラスは NSCopying プロトコルに準拠して、そのクラスのインスタンスをコピーできることを示すことができます。通常、クラスをコピーしたくないので、そこでクラス メソッドは定義されません。ただし、オブジェクトがクラスなのかインスタンスなのかわからない場合がありますが、conformsToProtocol:どちらを呼び出しても同じ値が返されます。同じ名前のクラス メソッドを作成することでcopyWithZone:、インスタンスまたはクラスがあるかどうかわからなくても、呼び出しても安全であることがわかります。

于 2011-08-24T00:20:58.307 に答える