2011-11-06 13 views
5

私は客観的なCを学びたいと思っています。たとえば、このコードを取ってみましょう:目的Cいつallocを使うべきか、そうでないとき

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

最初に割り当てるにはどうすればいいですか?

UIAlert *alert = [[UIAlertView alloc]] 

私は行方不明だが、奇妙なことに、奇妙なことに投稿することなく説明を見つけるのが苦労していると確信している。ありがとう!!

+0

@jrturton:私が言ったように、私は持っているし、それは私には意味がありません、私は通常ここで良い説明を得るので、誰かが良い答えを与えることができると思った。アップルの開発者向けドキュメントは恐ろしいもので、恐ろしいことが知られています。私のものに反応するときは、実際の答えを質問にしてください。私はそれをお願い申し上げます。 – gcoleman0828

+0

あなたの質問には、ドキュメントを読んだり、問題のある部分を読んだりすることはありません。そんなに守らないでください! – jrturton

答えて

6

+allocの問題は、文字列のURLを返します。結果が保持されるため、後で-releaseまたは-autoreleaseへのコールとバランスをとる必要があります。 には、をクラスを使用するたびに繰り返し入力する必要がなくなり、という便利なコンストラクタまたはという便利なメソッドが一般的に作成されます。 +URLWithString:はそれらの一つであり、内部的には次のようになります。

+ (id)URLWithString: (NSString *)str { 
    return [[[self alloc] initWithString: str] autorelease]; 
} 

ので+allocあなたはためと呼ばなっている、とそう-autoreleaseです。

背景

のObjective-Cのメソッドの二つの広い種類がある:クラスメソッドとインスタンスメソッドは。クラスメソッドは、クラス自体に送信されます。であり、そのクラスのインスタンスを作成する必要はありません。インスタンスメソッドはインスタンスに送信され、インスタンスが占めるメモリにアクセスできます。クラスメソッドは+で始まります。インスタンスメソッドは-です。

+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は、NSObject,の一部ではないと定義されています。すべてのオブジェクトの一部にはの一部です。 +alloc-init-retain-releaseなどのココアメモリ管理は常にObjective-Cの一部ではなく、オブジェクトを使用しないオブジェクトを作成することができます。

実際にクラスのインスタンスを作成するには、+allocを呼び出す必要はありません。私はそれをお勧めしません。

+0

詳細な回答ありがとうございます。それは私が混乱していたことをもう少し明るくする。再度、感謝します! – gcoleman0828

2

あなたが所有する新しいオブジェクトを作成するには、allocメソッドを使用します。このように作成することを意味します。

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"] この物件のオーナーはあなたですか?あなたはそれを使用した後、

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

あなたは、このオブジェクト(URL)

[url release]; 

これは、Objective Cの

何あなたなステートメントについてでメモリ管理に関する主なトピックの一つであるを解放しなければならないと言うことができます、

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

私はそれを言わなければなりませんシステムは自動的にそれを解放するため、あなたはそれを解放する必要はありません(このオブジェクトに自動的にautoreleaseメッセージを送信します)

+1

@devcode、それは理にかなっていますが、私の次の質問は、あなたが "それを所有しているかどうかを気にする理由は何でしょうか"常にallocを使わず、これは何をあなたに買うのですか? – gcoleman0828

+0

あなたが所有するオブジェクトでは、あなたのアプリケーションで使用されるメモリを制御できます。このオブジェクトを使用した後は便利なコンストラクタを使用して解放する必要がありますが、システムはそのオブジェクトを即座に解放しないため、アプリは依然として不要なメモリのブロックを保持します。 allocを使用するのが最も良い選択肢です。 –

関連する問題