2011-08-16 9 views
1

私が読んできたチュートリアルのほとんどに、カスタムinitメソッドを持つクラスの例があります。今、例えば作成されていない可能性のあるオブジェクトを解放する

@implementation MyPerson 

-(id) initWithDefaultName { 
self = [super init]; 
if (self) { 
NSString *name = [[NSString alloc] initWithString:@"John Doe"]; 
} 
return self; 
} 

私ならば、これはクラッシュしないだろう、なぜ、私は私が

-(void) dealloc 
{ 
[name release]; 
[super dealloc]; 
} 

でこれをペアリングすることになっていますことを知って、私はしかし、理解していない何か、です[MyPerson init]の後に[MyPerson release]

EDIT:下記のコメントを読んで、上記の例のコードが正しくないとわかりました。私が得意とするのは、私のカスタムinitWithNameメソッドは、標準のinitメソッドが呼び出された場合には存在しないオブジェクトを割り当てて初期化することです。だから私のdeallocメソッドは、それを解放するコードが含まれていますが、これはまだ名前オブジェクトが作成されたことがない場合でも動作しますか?

+0

:: 'name'のは**にリリースされることはありません

のみリターンレジスタに収まらないような構造体としての戻り値の型のためにあなたが定義された戻り値を取得することはありません

'dealloc'は' name'インスタンス変数ではなく、ローカル変数に代入しているからです。 initメソッドのこのステートメントは、おそらく 'name = [[NSString alloc] initWithString:@" John Doe "];'だけを読み込んで、あなたの望む効果を得ているはずです。 – PeyloW

答えて

2

Foo foo = null; 
int bar foo.getBar(); 

あなたは、nullポインタ例外になるだろう。 Objective-Cでは、メッセージをnilに送信することはまったく問題ありません。ノーオペレーションとして扱われ、何も行われません。

小規模な警告があります。 ABIのデフォルトのリターン規則に適合するサイズを持つ戻り値型を持つメソッドは、データ型表現nilに等しい戻り値を返します。

Foo* foo = nil; 
id a = [foo objectValue]; // a will be nil 
BOOL b = [foo boolValue]; // b will be NO 
int c = [foo intValue];  // c will be 0 
float d = [foo floatValue]; // d will be 0.0f 

これは、あなたのコードに大きなメリットを持っている。この例を想像することができます:

if ([myString length] > 0) { 
    // Do stuff here 
} 

myStringが空の場合、それは問題ではありません。このようにして、これはすべての作業と収量予想戻り値はなります文字列、またはちょうどnil。両方の場合に、長さを問い合わせると0が返されます。 nil値がほとんど考慮されていないため、多くの操作を簡単に作成できます。その編集について

Foo* foo = nil; 
CGRect a = [foo rectValue]; // content of a will be undefined. 
+0

すばらしい答え。これは私のものではなく、受け入れられるものでなければなりません! – jrturton

+0

これはまだ問題ですが、上記の質問に修正を加えた場合、 –

+0

@Jack:あなたの範囲に論理エラーはありません。私はそのトピックに関するあなたの質問にコメントを書いています。 – PeyloW

1

安全にnilにリリースを送ることができます。ただし、initに割り当てるときは名前を保持する必要があることに注意してください。

+1

名前は文字列リテラルです。あなたもそれらを保持することができますが、実際には必要ありません(保持は単に効果がありません、どちらもリリース、AFAIKはありません)。名前がリテラルでないとすぐに、それは保持されなければなりません。 –

+0

私はそれを知りませんでしたthankyou – jrturton

+0

申し訳ありません、私はちょうどコードを読んで、それが私が得ていたものではなかったことを認識しました。私はそれを改訂しました。 –

5

インスタンス変数のデフォルト値はnilです。 nilにメッセージを送信しても効果はありません。

1

nilオブジェクトに何かを送信することはできますが、それだけで問題ありません。

ほとんどのチュートリアルでは、viewDidUnloadメソッドですべてのプロパティをnilに戻すように設定されています。あなたはこれをしなかった場合は、Javaで

関連する問題