2012-05-14 7 views
0

私は最初にNSObjectの "value"を宣言し、その後 "value"内のswitch文を実際に作成するforループを持っています。 「値」は、NSNumber、NSDate、NSData、NSStringまたはnilになります。これはコードです:目的C:switch insideループ - どのように(潜在的な)メモリリークを避けるか

for (int i = 0; i < self.columnCount; i++) { 
    NSObject *value; 
    switch (mysql_fields[i].type) { 
    case ... 
     ... 
    case MYSQL_TYPE_LONG: 
     value = [[NSNumber alloc] initWithInt:atoi(row[i])]; 
     /* [value autorelease]; */ // 2) 
     break; 
    case MYSQL_TYPE_DECIMAL: 
     NSString *decimal = [[NSString alloc] initWithCString:(char *)row[i] encoding:NSUTF8StringEncoding]; 
     value = [[NSDecimalNumber alloc] initWithString:decimal]; 
     /* [value autorelease]; */ // 2) 
     [decimal release]; 
     break; 
    case ... 
     ... 
    } // end of switch 
} end of for 
Field *field = [[[Field alloc] initWithRecord:record] autorelease]; 
/* [value autorelease]; */ // 3) 
[field setValue:value forKey:@"value"]; 
/* [value release]; */ // 4) 

「値」を解放する方法はわかりません。これは私が試したものではなく、対応するXcodeの4 "アナライザ" メッセージ:

  1. NO放出 - > "潜在的な漏れ"
  2. 各caseステートメント内のalloc/INIT後の[値の自動解放] - >「オブジェクトは自動解放を送りました"値の自動解放"直前の使用の直前 - > "オブジェクト送信autorelease too many times"
  3. 最後の使用後の値の解放 - > "オブジェクトの参照カウントの不正確な減少この時点で発信者が所有している "

答えて

1

は、オブジェクトを割り当てる場合にのみ、自動解放を追加し、残りを削除します。

value = [[[NSNumber alloc] initWithInt:atoi(row[i])] autorelease]; 
// .... 
value = [[[NSDecimalNumber alloc] initWithString:decimal] autorelease]; 
+0

これは、「アナライザ」で「オブジェクトが自動送信される回数が多すぎます」というケース2)と同じです。 – Eliott

0

あなたはスイッチの後でのためのループ内でそれを解放する必要があるので、あなたは、forループの内側valueを宣言しています。

for (int i = 0; i < self.columnCount; i++) 
{ 
    NSObject *value; 
    switch (mysql_fields[i].type) 
    { 
     case ... 
      ... 
     case MYSQL_TYPE_LONG: 
      value = [[NSNumber alloc] initWithInt:atoi(row[i])]; 
      break; 
     case MYSQL_TYPE_DECIMAL: 
      NSString *decimal = [[NSString alloc] initWithCString:(char *)row[i] encoding:NSUTF8StringEncoding]; 
      value = [[NSDecimalNumber alloc] initWithString:decimal]; 
      [decimal release]; 
      break; 
     case ... 
      ... 
    } 
    Field *field = [[[Field alloc] initWithRecord:record] autorelease]; 
    [field setValue:value forKey:@"value"]; 
    [value release]; 
} 
+1

これはケース4)です。「アナライザ」のメッセージ「この時点で呼び出し元が所有していないオブジェクトの参照カウントが不正確に減少しました」 – Eliott

+0

例4はforループの外側にあります。これは大きな違いです。 –

+0

これは当てはまりますが、この質問のコードを簡素化しながら間違ったことが起こりました。そのために残念。 – Eliott

関連する問題