2012-04-03 4 views
0

オブジェクト:は解除または自動解放は、私はこのコードを理解する問題を抱えている

- (void)subnetMaskByNumberOfSubnetBits:(id)sender{ 

    // ------- Sets the subnet mask when the user selects the number of bits 

    NSNumberFormatter *stringToNumber = [[NSNumberFormatter alloc] init];//TURN A STRING INTO A NUMBER 
    NSNumber *selectedAmountOfBits = [[NSNumber alloc] init];//CONTAINS THE SELECTED NUMBER OF BITS 

     selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]]; 

     [self changeSubnetMaskUsingNumberOfMaskBits:selectedAmountOfBits]; 

     //RELEASE 
     [stringToNumber release]; 
     [selectedAmountOfBits release]; 
} 

私はので、私はselectedAmountOfBitsをリリースしているという事実の誤りを取得保管。 allocinitを使用してオブジェクトを初期化しました。 なぜ私はそれを解放する必要はありませんか?

答えて

2

問題は、selectedAmountOfBits にオブジェクトを割り当てることです。です。

NSNumber *selectedAmountOfBits = [[NSNumber alloc] init]; 

は、あなたが所有して新しいのNSNumberオブジェクトを割り当て、selectedAmountOfBitsに割り当てます。

selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]]; 

selectedAmountOfBits新しい自動解放オブジェクトを割り当てます。これは、[selectedAmountOfBits release]を実行すると、実際に所有していないオブジェクトをリリースしようとしていることを意味します。また、あなたが作成したオリジナルのNSNumberは、あなたがそれを参照していないので漏れています。

ソリューションは、自動解放のNSNumberを保つ、のalloc/initの行を削除し、あなたはそれを解放ラインを取り除くことです。最終的なコードは次のようになります。

- (void)subnetMaskByNumberOfSubnetBits:(id)sender{ 

    // ------- Sets the subnet mask when the user selects the number of bits 

    NSNumberFormatter *stringToNumber = [[NSNumberFormatter alloc] init];//TURN A STRING INTO A NUMBER 
     NSNumber *selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]]; 

     [self changeSubnetMaskUsingNumberOfMaskBits:selectedAmountOfBits]; 

     //RELEASE 
     [stringToNumber release]; 
} 
0

元のコードでいくつかの問題は、私が追加//あり、以下の私のコメント:!

- (void)subnetMaskByNumberOfSubnetBits:(id)sender{ 
    NSNumberFormatter *stringToNumber = [[NSNumberFormatter alloc] init]; 

    //!i: The [[NSNumber alloc] init] is unnecessary. You are creating a pointer to a dummy number 
    // that is immediately overwritten in the next line 
    NSNumber *selectedAmountOfBits = [[NSNumber alloc] init]; 

    //!i: At this point, you overwrite the pointer stored in selectedAmountOfBits to point to a new 
    // NSNumber, returned by numberFromString:, and in the autorelease pool 
     selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]]; 

    //!i: you are now leaking the number allocated via [[NSNumber alloc] init], as you no longer have 
    // a variable tracking the pointer to it 

    [self changeSubnetMaskUsingNumberOfMaskBits:selectedAmountOfBits]; 

    [stringToNumber release]; 

    //!i: You are calling -release on the number that is in the autorelease pool, not on the 
    // original number you allocated via [[NSNumber alloc] init] 
    [selectedAmountOfBits release]; 
} 

次のように、この問題を解決することができます

- (void)subnetMaskByNumberOfSubnetBits:(id)sender{ 
    NSNumberFormatter *stringToNumber = [[NSNumberFormatter alloc] init]; 
    NSNumber *selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]]; 

    [self changeSubnetMaskUsingNumberOfMaskBits:selectedAmountOfBits]; 

    //!i: You still need the -release here, as stringToNumber points to the 
    // NSNumberFormatter that you created using alloc/init 
    [stringToNumber release]; 
} 
+0

私のために物事をクリアしてくれてありがとう:) – Cubia

+0

UIAdamも正しい - 彼は私がやる前に数分でそれを得た;) – iccir