私は最初に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 "アナライザ" メッセージ:
- NO放出 - > "潜在的な漏れ"
- 各caseステートメント内のalloc/INIT後の[値の自動解放] - >「オブジェクトは自動解放を送りました"値の自動解放"直前の使用の直前 - > "オブジェクト送信autorelease too many times"
- 最後の使用後の値の解放 - > "オブジェクトの参照カウントの不正確な減少この時点で発信者が所有している "
これは、「アナライザ」で「オブジェクトが自動送信される回数が多すぎます」というケース2)と同じです。 – Eliott