2

ここでメモリリークが発生する原因:

私はグローバル変数を持っています:

@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;
}

私のView Controllerには、次の関数呼び出しがあります。

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

次に、viewcontroller クラス コードのどこかで、productArray の値をリセットします。

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

その後、漏れが発生します。

4

1 に答える 1

-2

リークの原因となっている行は、try-catch ステートメントであることが判明しました。私はこのようなものを持っていました:

Product *product = nil;

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

インデックスが範囲外かどうかを確認したくありませんでした。そのため、try-catch に入れて、例外が発生した場合に返します。

そのため、try-catch を削除しようとしたところ、次のようなものがありました。

Product *product = nil;

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

やっと漏れがなくなりました。

于 2013-10-18T04:10:55.940 に答える