Вставьте HTML в вид из контроллера AngularJS

Начнем с retain и release; autorelease - это действительно особый случай, когда вы понимаете основные понятия.

В Cocoa каждый объект отслеживает, сколько раз он ссылается (в частности, базовый класс NSObject реализует это). Вызывая retain на объекте, вы говорите, что хотите увеличить его количество ссылок на единицу. Вызывая release, вы указываете объект, от которого вы его отпустите, и его счетчик ссылок уменьшается. Если после вызова release счетчик ссылок теперь равен нулю, тогда память этого объекта освобождается системой.

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

Что иногда может быть смущает знание обстоятельств, при которых вы должны называть retain и release. Мое общее правило состоит в том, что если я хочу некоторое время зависать с объектом (если это переменная-член в классе), то мне нужно убедиться, что счетчик ссылок объекта знает обо мне. Как описано выше, счетчик ссылок объекта увеличивается, вызывая retain. По соглашению, он также увеличивается (устанавливается на 1, действительно), когда объект создается с помощью метода «init». В любом из этих случаев моя обязанность называть release объектом, когда я закончил с этим. Если я этого не сделаю, произойдет утечка памяти.

Пример создания объекта:

NSString* s = [[NSString alloc] init];  // Ref count is 1
[s retain];                             // Ref count is 2 - silly
                                        //   to do this after init
[s release];                            // Ref count is back to 1
[s release];                            // Ref count is 0, object is freed

Теперь для autorelease. Автореферат используется как удобный (а иногда и необходимый) способ сообщить системе, чтобы освободить этот объект через некоторое время. С точки зрения водопровода, когда вызывается autorelease, текущий поток NSAutoreleasePool предупреждается о вызове. NSAutoreleasePool теперь знает, что как только он получит возможность (после текущей итерации цикла событий), он может вызвать release на объекте. С нашей точки зрения, как программисты, он заботится о том, чтобы называть нас release, поэтому нам не нужно (и на самом деле мы не должны).

Важно отметить, что (снова , по соглашению) все методы создания объекта class возвращают автореализованный объект. Например, в следующем примере переменная «s» имеет счетчик ссылок 1, но после того, как цикл цикла завершен, он будет уничтожен.

NSString* s = [NSString stringWithString:@"Hello World"];

Если вы хотите висеть на этой строке , вам нужно будет явно вызвать retain, а затем явно release, когда вы закончите.

Рассмотрим следующий (очень надуманный) бит кода, и вы увидите ситуацию где требуется autorelease:

- (NSString*)createHelloWorldString
{
    NSString* s = [[NSString alloc] initWithString:@"Hello World"];

    // Now what?  We want to return s, but we've upped its reference count.
    // The caller shouldn't be responsible for releasing it, since we're the
    // ones that created it.  If we call release, however, the reference 
    // count will hit zero and bad memory will be returned to the caller.  
    // The answer is to call autorelease before returning the string.  By 
    // explicitly calling autorelease, we pass the responsibility for
    // releasing the string on to the thread's NSAutoreleasePool, which will
    // happen at some later time.  The consequence is that the returned string 
    // will still be valid for the caller of this function.
    return [s autorelease];
}

Я понимаю, что все это немного запутанно - в какой-то момент, однако, он щелкнет. Вот несколько ссылок, которые помогут вам:

  • Введение в Apple для управления памятью.
  • Программирование какао для Mac OS X ( 4-е издание) , автор Aaron Hillegas - очень хорошо написанная книга с множеством замечательных примеров. Это читается как учебник.
  • Если вы действительно погружаетесь, вы можете отправиться в Big Nerd Ranch . Это учебное заведение, которое ведет Аарон Хильгамас - автор книги, упомянутой выше. Несколько лет назад я посещал курс Intro to Cocoa, и это был отличный способ узнать.

779
задан georgeawg 6 April 2019 в 21:41
поделиться