В чем разница между выпуском и автореализацией?

У меня все еще есть некоторые непонятные идеи относительно выпуска и авторекламы. В чем разница между ними? У меня есть этот код. Для подключения к facebook. Я иногда сталкиваюсь с этим сбоем, когда я захожу на вход в Facebook, я сомневаюсь, возможно, это потому, что я не освобождаю объект красиво.? Спасибо за любую помощь.

if (_session.isConnected) {
        [_session logout];
    } else {
        FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
        [dialog show];
    }

Ответ 1

Руководство по программированию памяти для Cocoa скоро станет вашим лучшим другом. Короче говоря, экземпляры объектов в Cocoa управляются памятью с использованием подсчета ссылок (если, конечно, вы не используете сбор мусора в OS X). Объект указывает, что он хочет "сохранить" долю собственности в другом экземпляре - не освобождать его от освобождения - отправив ему сообщение -retain. Объект указывает, что он хочет освободить этот интерес, отправив другому экземпляру сообщение -release. Если количество объектов, которые имеют "сохраненные" и права собственности на объект, падает до 0 (то есть, когда последний из экземпляров владельца отправляет сообщение -release), экземпляр с номером сохранения 0 освобождается.

Иногда бывает удобно сказать: "Я хочу, чтобы этот экземпляр был выпущен в будущем". Это цель -autorelease. Отправка сообщения -autorelease добавляет приемник к текущему значению NSAutoreleasePool. Когда этот пул исчерпан, он отправляет сообщение -release всем экземплярам в пуле. NSAutoreleasePool автоматически создается в начале каждой итерации каждого цикла выполнения потока и сливается в конце этой итерации. Таким образом, вы можете сделать что-то подобное в методе:

- (id)myMethod {
  return [[[MyObject alloc] init] autorelease];
}

Вызывающий этого метода вернет экземпляр, который может -retain, если он хочет его сохранить. Если они не сохранят его, он будет придерживаться, по крайней мере, до тех пор, пока не будет слит закрытый бассейн автореферата:

- (void)someOtherMethod {
...

id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns

}

Ответ 2

Освобождение означает, что вы немедленно отпустите это. Autoreleasing означает, что вы хотите, чтобы переменная была выпущена в следующем пуле автозапуска.

Вы используете autorelease, если хотите сохранить сохранение переменной, но не хотите создавать утечку памяти. Вы используете release, когда вам больше не нужна переменная.

Пример:

- (NSNumber *)return5 {
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
    [result autorelease];
    return result;
}

Почему мы используем autorelease?

Если вместо этого использовать [result release], в это время будет уничтожен переменный результат. Это означает, что возвращаемое значение будет мусором.

Если мы вообще не отпустим, переменная result будет удерживать FOREVER в результате утечки памяти.

Мы можем рассказать каждому вызывающему устройству о возможности выпуска результата, но это будет головная боль и склонна к ошибке.

Таким образом, мы используем autorelease. Мы отмечаем переменную, которая будет выпущена в следующем пуле автозапуска. В основном мы отмечаем переменную, которая будет выпущена рядом с alloc. Следовательно, мантра-разряд в паре с выпуском в той же функции сохраняется все время.

Собственно, вы сделаете все возможное, чтобы сменить все выпуски на autorelease. Использование памяти не будет эффективным, однако эффект минимален. Все переменные на всем языке программирования эффективно автореализовываются.

В любом случае, используйте ARC.

Ответ 3

фоновая дискуссия:

objective-c подсчитывается ссылка, поэтому объекты удаляются, когда счетчик ссылок достигает 0. release немедленно освобождает счетчик ссылок, автореклама уменьшает его, когда пул авторезистов выгружается

когда использовать:

используйте autorelease при распределении объекта, если

  • вам не нужно это после текущей функции
  • он будет удален другой функцией objet/, и будет выпущен позже сохраняющим кодом
  • когда логика текущей функции сложна, поэтому вам нужно отправить выпуск в десятке разных мест, прежде чем делать возврат

используйте "ручной" выпуск

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

но действительно мой freand:

Эрик

Ответ 4

Согласно Руководству по программированию управления памятью для cocoa:

Метод автоматического выпуска, определенный как NSObject, помечает получателя на потом выпуск. Автоматическим выпуском объект, то есть, отправив ему сообщение об автозапуске - вы заявляете, что Вы не хотите владеть объектом за рамки, в которой вы отправили autorelease.

Также:

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