0

最初に NSObject の「値」が宣言され、次に「値」内の switch ステートメントが実際に作成される for ループがあります。「値」は、NSNumber、NSDate、NSData、NSString、または nil にすることができます。これはコードです:

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. リリースなし - >「潜在的なリーク」
  2. [value autorelease] 各 case ステートメント内の alloc/init の後 -> 「オブジェクトが autorelease を何度も送信しました」
  3. [value autorelease] 最後の使用の直前 -> 「オブジェクトが autorelease を送信した回数が多すぎます」
  4. [値の解放] 最後の使用後 -> 「この時点で呼び出し元が所有していないオブジェクトの参照カウントの誤ったデクリメント」
4

2 に答える 2

1

オブジェクトを割り当てる場所にのみ autorelease を追加し、残りを削除します。

value = [[[NSNumber alloc] initWithInt:atoi(row[i])] autorelease];
// ....
value = [[[NSDecimalNumber alloc] initWithString:decimal] autorelease];
于 2012-05-14T08:25:25.843 に答える
0

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

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];
}
于 2012-05-14T08:31:57.230 に答える