の問題+alloc
は、結果が保持されることです。そのため、以降の呼び出しとバランスを取る必要があり-release
ます-autorelease
。クラスが使用されるたびに何度も入力する必要がないように、API 設計者は通常、いわゆるコンビニエンスコンストラクターまたはコンビニエンス メソッドを作成します。+URLWithString:
はそのうちの 1 つで、内部的には次のようになります。
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
あなたのため+alloc
に呼ばれているのもそうです。-autorelease
バックグラウンド
Objective-C には、クラス メソッドとインスタンス メソッドの 2 種類のメソッドがあります。クラス メソッドはクラス自体に送信され、そのクラスのインスタンスを作成する必要はありません。インスタンス メソッドはインスタンスに送信され、インスタンスが占有するメモリにアクセスできます。クラス メソッドは+
;で始まります。を使用したインスタンス メソッド-
。
+alloc
クラスメソッドです。それは、特定のオブジェクトを作成する力を持つ魔法のものではありません。内部で行うのは次のようなものだけです。
+ (id)alloc {
id result = malloc(class_getInstanceSize(self));
if (result) {
memset(result, 0, class_getInstanceSize(self));
result->isa = self;
result->retainCount = 1;
}
return result;
}
(実際にはそれより少し複雑ですが、ここでは十分です。)はすべてのオブジェクトの一部ではなく、+alloc
の一部として定義されていることに注意してください。、、、などを使用した Cocoa メモリ管理は、常に Objective-C の一部であるとは限らず、それを使用しないオブジェクトを作成することもできます。NSObject
+alloc
-init
-retain
-release
適切な呪文を知っていれば、呼び出しを行わず+alloc
に実際にクラスのインスタンスを作成できます。私はそれをお勧めしません。