Est-ce que quelqu'un pourrait m'aider à repérer la fuite? Je ne sais pas vraiment où ma fuite est. Donc, je vais poster mon code ici et j'espère que quelqu'un peut le repérer pour moi. Dans l'instrument de fuite, il est dit que le cadre responsable est dispatch_semaphore_create
que je n'appelle pas?Objective-C - Les fuites de profilage montrent que la fuite de Grand Central Dispatch
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([defaults boolForKey:@"notFirstRunSeminars"]) {
BOOL isUpdated = self.seminarsParser.seminarsAreUpdated;
if (isUpdated) {
DLog(@"Seminars have been updated");
[[NSNotificationCenter defaultCenter]
postNotificationName:@"updateSeminarsTable"
object:nil];
[[[[[self tabBarController] tabBar] items] objectAtIndex:kSeminarsTabIndex] setBadgeValue:self.seminarsParser.numberOfNewSeminars];
self.seminarsParser.numberOfNewSeminars = nil;
}
}
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([defaults boolForKey:@"notFirstRunCareers"]) {
BOOL isUpdated = self.careersParser.careersAreUpdated;
if (isUpdated) {
DLog(@"Careers have been updated");
[[NSNotificationCenter defaultCenter]
postNotificationName:@"updateCareersTable"
object:nil];
[[[[[self tabBarController] tabBar] items] objectAtIndex:kCareersTabIndex] setBadgeValue:self.careersParser.numberOfNewCareers];
self.careersParser.numberOfNewCareers = nil;
}
}
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([defaults boolForKey:@"notFirstRunOffices"]) {
BOOL isUpdated = [officesParser officesAreUpdated];
if (isUpdated) {
DLog(@"Offices have been updated");
[[NSNotificationCenter defaultCenter]
postNotificationName:@"updateOfficesTable"
object:nil];
}
}
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
});
});
Donc, puisque mes notifications sont essentiellement un appel à 'UITableView' à 'reloadData' je devrais mettre les appels "post notification" dans les threads principaux? –
@Peter Correct. Si vous voulez voir comment votre programme circule dans le débogueur, ajoutez 'assert ([NSThread isMainThread])' 'à toutes les méthodes qui appellent directement ou indirectement les objets UIKit (messages directs, lectures/écritures de propriété, notifications, rechargements de tables, etc.). En pratique, vous pouvez * envoyer * un message aux objets UIKit pour accéder à * votre * implémentation/propriétés si vous vous assurez que vos implémentations sont sûres pour les threads * et * si elles n'entrent pas dans l'implémentation des objets UIKit. Une autre idée fausse commune est que 'atomic_property == thread safe', mais ce n'est pas threadsafe. – justin
Malheureusement, je reçois les mêmes fuites de mémoire (Malloc 64 octets) après avoir placé l'appel dans un thread principal. Le code que vous voyez ci-dessus est mis à l'intérieur de '- applicationWillEnterForeground:' de sorte que chaque fois que je reprends l'application, j'ai la fuite de mémoire. Mais quand j'y pense. Ce n'est pas cette notification de publication qui cause la fuite de mémoire parce que j'obtiens les fuites même si 'isUpdated' est' NON'. Ce qui donne? –