5

私はオブジェクティブ C を学ぼうとしていますが、従うのが非常に奇妙だと思うことの 1 つは、いつ alloc を使用し、いつ使用しないかです。たとえば、次のコード スニップを見てください。

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

最初に割り当てるために、このようなことをする必要がないのはなぜですか?

UIAlert *alert = [[UIAlertView alloc]]

客観的な C にはいくつかの基本的なことが欠けていると確信していますが、奇妙なことに、投稿せずに説明を見つけるのに苦労しています。ありがとう!!

4

2 に答える 2

7

の問題+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に実際にクラスのインスタンスを作成できます。私はそれをお勧めしません。

于 2011-11-06T14:12:59.507 に答える
2

alloc メソッドを使用して、自分が所有する新しいオブジェクトを作成します。このように作成するということです

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"]、あなたはこのオブジェクトの所有者になります。あなたがそれを使用した後、言ってみましょう

NSLog ("Url path is %@",url);

このオブジェクト (url) を解放する必要があります

[url release];

これは、Objective C でのメモリ管理に関する主要なトピックの 1 つです。

あなたの声明はどうですか、

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

システムは文字列を含む URL を返すと言わなければなりませんが、あなたが所有しているものではないため、システムが自動的に解放するため、解放する必要はありません (このオブジェクトには自動的に自動解放メッセージが送信されます)。

于 2011-11-06T14:12:20.343 に答える