2011-12-22 16 views
0

私はObjective Cのに新しいですし、ここに私の混乱である:客観C:メモリの割り当て

インスタンスのメモリを割り当てられ、それが適用される場合には?。このように:

それが適用これを使用することです...

NSString *str = [[NSString alloc]init]; 

及びこれを使用するには...

- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; 
... 
..... 
....... 
} 

とさえUIActionSheetを作成し、それが他のUIでのallocを使用していますが、要素はありません..

正確にはどのような理由がありますか?

ありがとう野郎..:D

答えて

2

ので「ファクトリメソッド」と呼ばを提供します。これらは内部的にオブジェクトを割り当てるクラスメソッドです。ファクトリメソッドを使用する利点は、適切なサブクラスを作成して呼び出し元に戻ることができることです。どちらの場合でも、割り当ては最終的にalloc/initによって行われます。

0

のObjective Cののallocメソッドは、メモリを割り当てる処理し、あなただけ保持し、リリースサイクルを管理し、割り当てを心配する必要はありません。

チェックアウト(すなわち[[MyClass alloc] init]介して)「通常の」割り当てルートいくつかのクラスに加えて、このAbout Memory Management article from Apple

0

alloc + initを使用してインスタンスを作成する場合、または名前にinit(慣習的な例:initWithString)を持つメソッドを使用してインスタンスを取得する場合、オブジェクトを所有すると言われます。 (refカウンタはすでに1に設定されています)、終了したら最終的にリリースする必要があります。名前にinitを持たないメソッドを呼び出すことによってインスタンスを受け取ると(親指のルールだが、常にドキュメントをチェックする必要があります)、これはあなたがオブジェクトの所有者ではないことを意味します。つまり、オブジェクトはいつでも解放される可能性がありますあなたがそれを使っている間でさえ、通常、stringWithFormatのようなメソッドは、(文字列にretainを呼び出すことによって所有権を主張している場合を除いて)イベントサイクルの終わりまで、自動解放されたオブジェクトを返します。 私は強く読むことをお勧めしますcocoa memory management guide.

NSString *str = [[NSString alloc]init]; //you own the object pointed to by str. Its retain count is 1. If you don't call release this will be a memory leak. 


- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; //you don't own str. btw, you don't need casting here 
//using str here might throw exception if its owner has released it 
    [str retain]; //you own str now. you can do whatever you want with it. It's yours 
....... 
} 
+0

感謝ペンチ.. – Aldee