/ / Цел С: Изтичане на паметта в метод за невалидни копия - цел-c, ios, изтичане на паметта

Цел C: Изтичане на паметта в метод за невалидни копия - цел-c, ios, изтичане на паметта

Получавам още изтичане на памет в метод на невалидни копия, който връща обект от клас NSMutableArray.

въведете описанието на изображението тук

Може ли някой да ми посъветва как мога да поправя този изтичане? Опитах се да пусна "userFollowings" в края на метода, но все още съобщава за изтичане.

Отговори:

9 за отговор № 1

Когато искате да върнете обект от даден методв който сте го инициализирали или сте запазили, е обичайна практика да го върнете автоматично. По този начин потребителят, който получава обекта, не трябва да се притеснява да го пусне. Така че последната ви линия код трябва да изглежда по следния начин:

return [userFollowing autorelease];

Вероятно нямаше да навреди да четеш малко от него Ръководство за програмиране за управление на паметта за да наваксате правилата за управление на паметта като това и има много други полезни ресурси в мрежата и на този сайт.


3 за отговор № 2

Има набор от конвенции използвана от програмите за какао, които правят управлението на паметта много по-малко склонно към грешки. Когато даден метод връща обект, кодът, който го нарича, трябва да знае дали го притежава или не.

Това, което се свежда до това е, че ако пишете метод, който връща обект и този метод не предава собствеността на обаждащия се, като се казва нещо като new, alloc, copy, и т.н., трябва да autorelease преди да го върнете.

Това е съобщението, за което говориш - "Обект, върнат на обаждащия се като собственик" означава, че предавате собствеността върху обаждащия се код. Проблемът е, че името на метода ви показва друго.

Ако трябваше да се обадя на вашия метод и трябваше да се мотае върху обекта, щях да се обадя retain на него, за да го притежавам. Трябва да направя това, защото името на метода означаваше, че не съм собственикът. Докато върнете авторелизиран обект, това е правилно. Но ако не решите автореласа на обекта, той ще завърши с резервен брой от 2 - веднъж, когато го разпределите и веднъж, когато го запази. Когато най-накрая се обръщат към освобождаването му, той все пак ще има запазване на 1 и никога няма да бъде дезактивиран от паметта, което ще доведе до изтичане на паметта.


2 за отговор № 3

Проблемът е, че userFollowings никога не се освобождава. Опитайте да завършите с

return [userFollowings autorelease];

1 за отговор № 4

Опитайте тази:

   NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]