2010-08-24 2 views
1

Когда я делать «Построение и анализ» Xcode дает мне следующее предупреждение:Объект просочился ... как я могу его решить?

Потенциальные утечки объекта, размещенного на линии 70

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

  2. не Looping назад к голове петли

  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); 
} 
+0

Это не связано с вашим вопросом, но если вы не сделали какой-то код, похоже, что этот внутренний цикл является бесполезным - вы устанавливаете значение newString, но ничего не делаете с ним. Ваш NSLog всегда печатает «X, Data: 6»? – blindjesse

ответ

5

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

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

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

NSString *newString = @"Data: "; 
+0

Thnaks, это сработало! – Abramodj

2

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]; 
} 
+0

Большое спасибо за ваш конструктивный ответ! Но, пожалуйста, отредактируйте его, потому что это неверно: метод appendFormat не возвращает новую строку, она только модифицирует ресивер. Итак: [newString appendFormat: @ "% d", d]; вместо newString = [newString appendFormat: @ "% d", d]; – Abramodj

+0

Хороший улов. Удалено ненужное переназначение newString. Использование NSMutableString уменьшит общий объем памяти по сравнению с созданием новых экземпляров NSString с помощью 'stringWithFormat'. – falconcreek

Смежные вопросы