2011-11-08 3 views
0

私はちょうどいくつかのコードを書いています。それは私のカスタムメイドのクラスを持っています。 「WonderfulNumbers」と呼ばれるそのカスタムメイドクラスでは私がIBActionを持っている私のメインで、その後明らかに私がメインに「WonderfulNumbers」#IMPORTこのオブジェクトを使用して割り当てまたは初期化していません

- (NSString *)storedNumberAsString { 
NSString *stringToReturn = [[NSString alloc]initWithFormat:@"Hello World"]; 
return [stringToReturn autorelease]; 
} 

のように見える方法となど を持っています。 それは私がステップのプロセスによってステップ、およびこの背後にあるロジックを取得するには、次の

-(IBAction)displaySomeText:(id)sender { 
    WonderfulNumbers *myNumber = [[WonderfulNumbers alloc]init];// Step 1 
    NSString *numberString = [myNumber storedNumberAsString];// Step 2 
    [textView insertText:numberString];// Step 3 
    //textView is a variable of NSTextView. 
    [myNumber release];// Step 4 
} 

のように読み取ります。 私が知っていると私の自己に安心して試してみたいことは、ステップ2

で起こっている正確に何である私はステップ1、3、4

しかし、ステップ2を理解して、私は「NSStringの変数が呼ばれるcrated numberString 'と明示的に' myNumber 'という名前のオブジェクトを保持しています。意味をなさない

私が知りたいのは、NSStringクラスの 'numberString'オブジェクトを割り当てたり、初期化したことはありません。どのように私はそれを使用することができます。 割り当てられていないので解放しないことは分かっていますが、[myNumber storedNumberAsString]を実行して初期化しました。 ?

少しの説明はすばらしいでしょう。返事をいただき、ありがとうございます。

P.S.私はobjective-cのすべてがオブジェクトであることを知っていますが、この引数のためだけに、 'numberString'は技術的に "allocateとinitによって作成されていない"ので、変数を呼び出すのは正しいですか?

私は両者の違いを知っていると思うが、安心してほしい。

ありがとうございました。

+0

"numberString"は、NSString @ "Hello World"である "storedNumberAsString"によって返された値へのポインタを格納します。 "numberString"自体はオブジェクトではなく、単にオブジェクトポインタを保持します。 (オブジェクト自体が名前を持っていると考える必要はありません。ポインタを持つ場所に名前が付いているだけです。) –

+0

(Sam、Joe、Peteという3つの机のあるオフィスのようなものです)。座っている人にかかわらず、この机の名前はピートに移動できます彼のために他の名前がなかったので、 "ピート"として知られています。 –

+0

素晴らしい、それは今どこにでも落ちています。ありがとう、一人の男。 –

答えて

2

NSString *stringToReturnを戻り値[myNumber storedNumberAsString]に初期化しています。 storedNumberAsStringの内部には、NSStringの参照が正しく割り当てられていることが表示されています。

ここでのキーはautoreleaseです。オブジェクトは自動的に「いつか後で」自動的に解放されます(実際には一番上の自動解放プールがリリースされたときに変更しない限り、イベントループの各繰り返し)。

のObjective-Cでの大会は、あなたallocまたはretainオブジェクト場合、または名前が始まるnewcopy、またはmutableCopyで、あなたはそれを解放する責任がある方法からオブジェクトを取得することです。そうでない場合は、誰かがそれを解放すると想定できます(たとえば、後でautorelease経由で)。 storedNumberAsStringnewcopy、またはmutableCopyで始まらないため、リリースする必要はありません。一方、storedNumberAsStringの実装では、オブジェクトallocが解放されることを保証する必要があります。この場合は、autoreleaseを呼び出して行います。

+0

ありがとうございます。 コードを実行してビルドすると、コードは正常に動作します。私が言う限り、それはしっかりしている。 私の心配は、私の頭に正確に何が起こっているのかということです。 私が頭に入れようとしていることは、「このプロセス全体のどの部分で「numberString」オブジェクトを正確に割り当てたのですか?」 ありがとう、もう一度ありがとう。 –

関連する問題