Объект просочился ... как я могу решить это? - PullRequest
1 голос
/ 25 августа 2010

Когда я делаю «Построить и проанализировать», xCode выдает мне следующее предупреждение:

Потенциальная утечка объекта, расположенного в строке 70

  1. Метод возвращает объект Objective C с счетом сохранения +1 (ссылка на владельца)

  2. Возвращение к началу цикла

  3. Объект, размещенный в строке 70, больше не используется после этой точки и имеет счет сохранения +1 (объект просочился)

Это код (строка 70 начинается с "NSString * newString"):

for(int j = 1; j < [smokeArray count]; j++) {

    NSString *newString = [[NSString alloc] initWithFormat:@"Data: "]; 
    int f = [[[smokeArray objectAtIndex:j] num] intValue];

    for (int i = 0; i<6; i++) {
        int d = [[[[smokeArray objectAtIndex:j] dat] objectAtIndex:i] intValue];

        if (i>0) {  newString = [newString stringByAppendingFormat:@"-%d",d];   }
        else {  newString = [newString stringByAppendingFormat:@"%d",d];  }

    }

    NSLog(@"%d, %@", f, newString);
}

Ответы [ 2 ]

5 голосов
/ 25 августа 2010

Самое простое, что нужно сделать, это autorelease:

NSString *newString = [[[NSString alloc] initWithFormat:@"Data: "] autorelease]; 

Или в конкретном случае, как указано выше, просто:

NSString *newString = @"Data: "; 
2 голосов
/ 25 августа 2010

stringByAppendingFormat возвращает новую строку autoreleased.Оригинал newString не выпускается.Вам будет лучше использовать NSMutableString и appendFormat.

for(int j = 1; j < [smokeArray count]; j++) {

    NSMutableString *newString = [[NSMutableString alloc] initWithString:@"Data: "]; 
    int f = [[[smokeArray objectAtIndex:j] num] intValue];

    for (int i = 0; i<6; i++) {
        int d = [[[[smokeArray objectAtIndex:j] dat] objectAtIndex:i] intValue];

        if ( d > 0) {  [newString appendFormat:@"-%d",d];   } // fixed a potential logic error ( i > 0 )
        else { [newString appendFormat:@"%d",d];  }

    }

    NSLog(@"%d, %@", f, newString);
    // Do something useful like set a label or property with the string
    [newString release];
}
...