prepareResultsFromResultSet
コード(2.5MB)内のメモリリークをデバッグしようとしていますが、内の_を指しているようNSFetchedResultsController
です。2つのviewController(AとB)があり、viewControllerBはviewControllerAからnavigationControllerにプッシュされます。
BIでは、次
のようにNSFetchRequest
使用を実行しています。NSFetchedResultsController
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSString *sMapSlug;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andMapSlug: (NSString *)slug;
.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andMapSlug: (NSString *)slug
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
self.sMapSlug = [NSString stringWithString:slug];
}
return self;
}
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil)
return _fetchedResultsController;
Singleton *singleton = [Singleton sharedSingleton];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DescriptionEntity" inManagedObjectContext:[singleton managedObjectContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"map.sName" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"map.sSlug LIKE %@", self.sMapSlug];
[fetchRequest setFetchBatchSize:8];
[fetchRequest setPredicate:myPredicate];
// Finally check the results
NSError *error;
NSArray *fetchedObjects = [[singleton managedObjectContext] executeFetchRequest:fetchRequest error:&error];
for (DescriptionEntity *desc in fetchedObjects)
{
NSLog(@"Maps present in database: %@", desc.map.sName);
}
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[singleton managedObjectContext] sectionNameKeyPath:nil cacheName:@"Test1"];
self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController.delegate = self;
//[self.fetchedResultsController performFetch:NULL];
[theFetchedResultsController release];
[fetchRequest release];
[sort release];
return _fetchedResultsController;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.fetchedResultsController fetchRequest];
}
fetchRequestを使用してすべてが正常に読み込まれ、必要に応じてデータにアクセスできますが、今のところこれを取り出しているので、からのデータNSFetchedRequestController
が使用されていないことがわかります。ナビゲーションスタックに戻ると、コントローラーBのdeallocが呼び出され、次のように実行します。
- (void)dealloc {
self.fetchedResultsController.delegate = nil;
[_fetchedResultsController release];
[sMapSlug release];
[super dealloc];
}
Instruments内でこれのヒープショットを撮ると、deallocが呼び出された後も次のデータが残っていることがわかります。
コントローラBに戻ると、このメモリの別のセットが追加され、削除されることはありません。ただし、これを3回実行しても、金額は増加しません。ある種のキャッシュが行われていると思いますが、このデータを削除する方法や、を正しく割り当て解除する方法を教えてもらえますかNSFetchedResultsController
。
さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。