У меня проблемы с утечкой памяти на одном из моих контроллеров представления. Из моего основного контроллера просмотра я нажимаю свой контроллер просмотра настроек так:
-(IBAction)launchSettings {
SettingsViewController *svc = [[SettingsViewController alloc] init];
svc.title = @"title of app";
//this actually adds a back button for the next vc pushed
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil] autorelease];
[[self navigationController] pushViewController:svc animated:YES]; // <--Instruments says leak is here
[svc release];
if (AdsAreEnabled) {
ADBannerView *adBanner = SharedAdBannerView;
adBanner.delegate = nil;
}
}
Итак, когда я первоначально нажимаю на контроллер вида, у меня нет утечек. Контроллер представления использует очередь GCD для загрузки моего магазина покупок в приложении, и когда я нажимаю кнопку «назад», которую я создал выше, чтобы вытолкнуть ее из стека, это происходит, когда в инструментах появляется дрянь утечек. В строке кода появляется куча, где я нажимаю контроллер представления, что не имеет смысла для меня, так как я немедленно выпускаю его.
Пара других утечек протекает только в основном, либо NSCFstring
s, SKProduct
и SKProductInternal
, которые, я думаю, возникают только в очереди GCD. Вот где инструменты говорят мне, что проблема:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil); // <-- Instruments says leak is here
[pool release];
return retVal;
}
Вот мой код, где я вызываю GCD, в своем собственном методе, который вызывается во время viewDidLoad
из SettingsViewController
:
if ([iapManager canMakePurchases]) {
// Display a store to the user.
iapTableView.sectionFooterHeight = 0;
iapTableView.rowHeight = 50;
iapTableView.scrollEnabled = NO;
//init sectionNames here to avoid leakage.
sectionNames = [[NSArray alloc] initWithObjects:@"Get Rid of Ads!", nil];
[spinner startAnimating];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadStore) name:kInAppPurchaseManagerProductsFetchedNotification object:iapManager];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadStore) name:kTransactionCompleted object:iapManager];
//Run this in seperate thread to avoid UI lockup
dispatch_queue_t store_check = dispatch_queue_create("see if store is available", NULL);
dispatch_async(store_check, ^ {
[iapManager loadStore];
});
dispatch_release(store_check);
}
Я немного озадачен тем, что я сделал здесь неправильно - я использую точно такую же технику для загрузки другого контроллера представления, и он не протекает, и я не могу понять, как определить, / где мой материал GCD протекает - все неоднократно анализировалось и выходит чистым. Я удаляю своего наблюдателя из Центра уведомлений в dealloc
SVC, так что это не так. Я удостоверился, что удалил наблюдателя транзакции в моем диспетчере IAP dealloc
, так что это не так.
Есть предложения? Что-нибудь еще, что вам нужно знать, чтобы помочь мне понять, где я так ужасно ошибся?
Отредактировано, чтобы добавить: я выпускаю sectionNames в методе dealloc
SVC, так что это тоже не так.
Редактировать 2: Я пробовал auto- releasing
svc, когда я alloc
его (и избавляюсь от соответствующего release
), но я все еще получаю те же утечки.