Утечка памяти и лучшая практика освобождения объектов - PullRequest
0 голосов
/ 09 марта 2011

Leak:

 + ( myDetails* ) initEmptySlideDetails { //ok
    myDetails* theObject = [[myDetails alloc] init];
    theObject.ID = 0;
    return theObject;
}

Вопрос 1. Правильный ли это способ вернуть объект, который я также хочу освободить, чтобы избежать утечки памяти?

Нет утечки:

+ ( myDetails* ) initEmptySlideDetails { //ok
        myDetails* theObject = [[myDetails alloc] init];
        theObject.ID = 0;
        return [theObject autorelease];
    }

Вопрос2: Нужно ли форсировать удержание при использовании объекта?(из-за авто-релиза).

myDetails* myDetails = [myDetails initEmptySlideDetails];

Надеюсь, мне ясно ...:)

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Причина, по которой вас предупреждают об утечке в первом примере, заключается в соглашении об именах.Обычно ожидается, что метод класса, который начинается с new, возвратит сохраненный объект, а большинство других методов класса должны возвращать объект с автоматическим освобождением.Так как ваш метод не начинается с new, но вы возвращаете сохраненный объект, анализатор думает, что вы собираетесь утечь объект.Решение здесь состоит в том, чтобы дать вашему методу более подходящее имя, например:

+ (MyDetails *) newMyDetails;

Существует несколько других соглашений, которые вы не соблюдаете (и, вероятно, вам следует).

  1. Любой метод, который начинается с init, является инициализатором.Это должен быть метод экземпляра, и он должен возвращать либо self, либо результаты другого инициализатора.Прочтите документацию Apple о том, как правильно создать метод init.
  2. Имена классов всегда начинаются с заглавных букв.Ваш класс должен быть назван MyDetails.
1 голос
/ 09 марта 2011

Q1: "initEmptySlideDetails" - плохое имя для функции, так как оно может быть ошибочно принято за инициализатор для вашего класса. Если вы называете метод, чтобы начать с «alloc» или «new», или называете его содержащим слово «copy», то вы не должны автоматически выпускать его. В противном случае вы должны. По крайней мере, если вы хотите следовать стандартным правилам Apple по управлению памятью .

Q2: объект, который автоматически высвобождается, может использоваться в текущем методе, передаваться другим методам и может быть возвращен из вашего текущего метода. Но это не может быть сохранено на потом без сохранения. Обратите внимание, что сохранение может быть неявным, например, если вы назначаете его свойству, объявленному как «retain», или добавляете его в NSArray, NSDictionary, NSSet или другую коллекцию, в которой сохраняются его члены. Кроме того, если вы связываетесь с NSAutoreleasePool, это может привести к более раннему освобождению объектов.

0 голосов
/ 09 марта 2011

Если вы показываете утечки с указанным кодом, значит что-то не так.Первый набор кода правильный.

Как вы узнали, что произошла утечка?инструменты?статический анализ?

Возможно, вы путаете статический анализатор с выбором префикса init.

вместо этого попробуйте setupEmptySlideDetails или makeEmptySlideDetails.

Edit

теперь второй набор кода верен.

Q2

вам не нужно удерживать его там.Авто-релиз означает, что объект будет выпущен в какой-то момент в будущем после завершения вашего метода.(это может быть скоро или может быть через несколько секунд).А пока, пока вы используете myDetails, все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...