Вопрос

Я читал о AutoreleasePool, но есть точка, которая немного неясна для меня. У меня есть некоторые функциональные возможности с использованием потоков, которые требовали отдельного управления памятью, используя AutoreLEasePool.

В следующем примере правильный

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

Это правильно?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

или это?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

Мой вопрос принадлежит объектам, созданным в объеме Autorelease Pool, необходимо удивляться специально или являются заботой о том, когда аутореласпелубол был освобожден?

Teo.

Это было полезно?

Решение

Авторелез у бассейна обрабатывает аутоверенные объекты. Если у вас есть объект (через alloC или копирование или сохранение), то вы должны отпустить его. Таким образом, ваш 2-й пример не правильный. Как вы выделили строку, вы владеете им, и вы должны освободить его.

Бассейн автореляции создан для основного потока. (Вы можете посмотреть в основную функцию, если хотите). Каждый поток нуждается в своем собственном автозапуске для управления ауторелированными объектами. Вот почему, если вы создаете еще одну тему, вы должны создать пул автореляции для этого потока. Даже если вы не создаете объект AutoRelened в потоке, вы должны создать это, так как библиотечные вызовы в этом потоке могут создавать аутоселенные объекты. Даже если вы уверены, что никаких библиотечных вызовов не создает объекты AutoReleded Objects, вы также должны создавать их как это лучшая практика, особенно если вы работаете над большим проектом, который разработан и поддерживается несколькими людьми.

Другие советы

Вам нужно только создать свой собственный авторелез, когда вы создаете кучу AutoRelened объектов, которые вы хотите сбраться с мусором. Тем не менее, вы правильно в том, что вы не хотите ссылаться на какие-либо «автозависимые» объекты, которые вы создаете после выпускания пула. Авторелируемые объекты (которые вы не сохраняете) разрушаются, когда пул сливается.

Поскольку ни один из объектов в вашем примере автоматически создается, создание собственного авторелезного пула, по сути, является NO-OP.

Ни один из ваших примеров не нуждается в автокреслином бассейне. Авторелейные бассейны заботятся о авторелизованных объектах:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

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

Это где вам понадобится бассейн:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

Здесь foo Строка будет утечна, если бы бассейн там не был. Обратите внимание, что я звоню drain вместо release На бассейне - на iOS нет никакой разницы, но в собранных на мусорных средах, которые двое отличаются, поэтому, вероятно, лучше попасть в привычку звонить правильному.

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

Думаю, что это должно быть что-то вроде этого:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

Вы должны отправить сообщение Autorelease, к объектам внутри авторелеизма. Они будут выпущены, когда сообщение выпуска отправляется в пул.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top