2013-10-11 3 views
2

Что cuases мою утечку памяти здесь:утечка памяти IOS

У меня есть глобальная переменная:

@property (nonatomic, strong) NSArray *productArray; 

У меня есть выполнение функции, которые запрашивают данные из основных данных:

- (NSArray *)fetchallProductWithTag:(NSString *)tag 
{ 
    NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"tags.name contains [cd] %@", tag]; 

    NSSet *itemsSet = [self.managedObjectContext   
     fetchObjectsForEntityName:TABLE_NAME_PRODUCT 
        withPredicate:predicate 
          columns:nil unique:NO]; 

    return itemsSet.allObjects; 
} 

Вот является реализация fetchObjectsForEntityName: withPredicate: columns: из категории:

- (NSSet *)fetchObjectsForEntityName:(NSString *)entityName 
        withPredicate:(NSPredicate *)predicate 
         columns:(NSArray *)columns 
          unique:(BOOL)unique 
    { 
     NSEntityDescription *entity = [NSEntityDescription 
      entityForName:entityName inManagedObjectContext:self]; 

     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

    [request setEntity:entity]; 
    [request setPredicate:predicate]; 
    [request setReturnsDistinctResults:unique]; 

    if(columns.count > 0) 
     [request setPropertiesToFetch:columns]; 

    if(columns.count > 0 || unique) 
     [request setResultType:NSDictionaryResultType]; 

    NSError *error = nil; 

    NSArray *results = [self executeFetchRequest:request error:&error]; 

    if (error != nil) 
    { 
      [NSException raise:NSGenericException 
       format:@"Error fetching in %@; error:%@", 
       entityName, error.localizedDescription]; 
    } 

    if(results.count > 0) 
    { 
     return [NSSet setWithArray:results]; 
    } 
    return nil; 
} 

На мой взгляд контроллер У меня есть эта функция вызова:

self.productArray = [myClass fetchAllProductWithTag:@"All"]; 

Тогда где-то в ViewController код класса сбросить значение productArray:

self.productArray = [myClass fetchAllProductWithTag:@"Favorites"]; 

Тогда утечка происходит.

+0

ARC или нет ARC? –

+0

И откуда вы знаете, что есть утечка? –

+0

Я использую ARC. xcode 5 – Hokage

ответ

-2

Оказалось, что линия, вызывающая утечку, была заявлением о попытке захвата. У меня было что-то вроде этого:

Product *product = nil; 

@try 
{ 
    product = [self.productArray objectAtIndex:index]; 
} 
@catch (NSException *exception) 
{ 
    return;   
} 

Я не хотел проверять, был ли указатель не связан. Поэтому я помещал его в try-catch и возвращал, если возникло исключение.

Итак, я попытался удалить примерочных поймать и что-то вроде этого:

Product *product = nil; 

if(index < self.productArray.count) 
    product = [self.productArray objectAtIndex:index] 
else 
    return; 

Наконец, утечка пропала.

+0

Что в try-catch, почему это вызывает утечку? – Hokage

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