是否有人可以幫助我發現泄漏。我真的不知道我的泄漏在哪裏。所以我會在這裏發佈我的代碼,希望有人能爲我發現它。在泄漏儀器中,它表示負責的框架是dispatch_semaphore_create
,我不打電話?Objective-C - 剖析泄漏顯示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];
});
});
因此,因爲我的通知基本上是調用'UITableView'到'reloadData',我應該在主線程中放置「發佈通知」調用? –
@彼得更正。如果你想看看你的程序如何在調試器中流動,可以爲所有那些直接或間接調用UIKit對象的方法添加assert([NSThread isMainThread]);(直接消息,屬性讀/寫,通知,表重載,等等。)。在實踐中,如果你確保你的實現是線程安全的,並且如果它們沒有進入UIKit對象的實現,你可以*發送UIKit對象來訪問你的*實現/屬性。另一個常見的誤解是'atomic_property ==線程安全性',但它不是線程安全的。 – justin
不幸的是,我在調用主線程後收到了相同的內存泄漏(Malloc 64字節)。上面看到的代碼放在' - applicationWillEnterForeground:'內部,所以每當我恢復應用程序時,都會發生內存泄漏。但是當我想到它時。這不是發佈通知導致內存泄漏,因爲即使'isUpdated'爲'NO',我也會泄漏內存。是什麼賦予了? –