Премини към съдържанието
View in the app

A better way to browse. Learn more.

BG iPhone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

managedObjectContext leak-ва

Featured Replies

Публикувано

Забелязах нещо интересно (поне за мен) и не можах да намеря обяснения на проблема из нет-а.

Ползвам CoreData и когато извикам примерно

NSArray *arr = [moc executeFetchRequest:request error:&error];

в Leaks tool-а казва, че при това положение има leak. Когато същевременно правя и heapshot-и показва същото.

Пробвах друг вариант - декларирах arr като глобален array и го ползвам така:

arr = [[moc executeFetchRequest:request error:&error] retain];

Ако не използвам reatin, приложението гърми. После в dealloc си викам [arr release];

В този случай пак показва, че има leak-ове, но при heapshot-ите всичко се норамлизира и след 2-3 опита Heap Growth става на 0 bytes, а # Still live - 0.

Загубите не са големи - 80bytes, но все пак ми е интересно да знам има ли вариант въобще да няма проблеми(защото все пак managedObjectContext-a(moc както съм го писал аз) си е apple-ски клас и не ми се струва нормално там да има пропуски) и дали като цяло втория вариант с глобалния масив е по-добър от първия?

Публикувано

А замислял ли си се дали няма грешки в самите Apple и да си прахосал няколко дена да ги издирваш?

Лично за мен първия вариант е по-добър. Все пак автоматичното освобождаване е благинка.

Втория вариант е алтернативен и не е по-зле от първия, но трябва да НЕ забравяш да освободиш arr когато приключи. При един обект е лесно, но когато станат доста и се намесят външни фактори става трудно.

На кой iOS го пробваш или на Симулатор? Пробвай да мръднеш версиите нагоре/надолу.

Публикувано

@iHustle - От това, което си написал е малко трудно да се ориетира човек какво точно се случва. При всички положения вероятността да има leak вътре в самата CoreData както предполага bgdn е почти нулев. Работата с инструментите за откриване на leak-ове е малко трудна и е лесно да се подведеш, че има leak а то всъщност да няма. Конретно за сорса, който си посочил мога да ти кажа следното:

Метода executeFetchRequest връща autorelease обект, който можеш да го ползваш само в рамките на същата функция освен ако не го retain-неш (NSAutoReleasePool-а ще го освободи след излизане от фукцията). Ето пример:


@interface DummyClass: NSObject {
NSArray *arr;
....
}

-(void) loadData;
......
@end


@implementation DummyClass
....
-(void) loadData {
NSError *error;

// Обекта arr ще се освободи след приключването на метода loadData . Тази конструкция е
// допустима ако ползваш arr обекта само в рамките на loadData метода (съответно няма нужда да е member на класа)
arr = [moc executeFetchRequest:request error:&error];
....
// Ако искаш да ползваш arr обекта и в други методи трябва да го retain-неш и
// съответно да го release-неш в dealloc метода
arr = [[moc executeFetchRequest:request error:&error] retain];
....
}

-(void) dealloc {
// Тук трябва да освобождиш arr обекта само ако си го retain-нал
// в loadData метода - иначе ще гръмне.
[arr release];
....
[super dealloc];
}

......
@end

Публикувано

@iHustle - напиши някакъв "HelloWorld" пример да го видим и ние. Без код наистина не може да се види къде е проблема.

@intruder - явно в Apple работят не-човеци защото изключваш проблеми в тяхната имплементация. :naughty3:

Публикувано
  • Автор

На симулатора тествам. Иначе абсолютно същия пример е и при мен и при двата случая има leak! Изглежда проблема е в телевизора на Apple обаче. Което според мен е тъпо :) Нооо никой не е перфектен. Мерси за отговорите :excl:

Публикувано

@bgdn - Принципно не изключвам проблеми в имплементациите на Apple и затова казах, че вероятността клони към нула - иначе щях да кажа, че няма такава вероятност. В конкретния случай си мисля, че проблема не е в тях, защото вече 4 години откакто се занимавам с Objective-C до сега съм чул само за един документиран случай за leak в SDK-то и то преди години (мисля че беше в MPMoviePlayerController класа). Още повече CoreData framework-а се ползва толкова много, че ако има подобна грешка в него ще я открият и оправят много бързо. ;)

@iHustle - Пак ти казвам - използването не интрументите за откриване на leak-ове никак не е проста работа. Аз и досега не съм открил добро ръководство, в което да е обяснено всички добре.

Редактирано от intruder

Публикувано
  • Автор

Ами това което правя аз е - Run -> Run with performance tool -> Leaks -> разцъквам насам-натам и се появяват едни червени чертички на лентата Leaks. После в листа с leak-ове разглеждам различните такива, като на всеки може да се види през кои методи минава и като избера метод ми показва точно в коя част на кода е предизвикан течът :) Но може и да я има възможността самия tool да засича грешно.

Цялото това обяснение съм го гледал в някакви видеота от WWDC2010.

Присъединете се към разговора

Можете да публикувате сега и да се регистрирате по-късно. Ако имате акаунт, влезте сега да публикувате с вашия акаунт.

Гост
Отговори в тази тема...

Разглеждащи в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Account

Navigation

Търсене

Търсене

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.