Что такое область автоматического выпуска? - PullRequest
0 голосов
/ 22 января 2012

Есть ли вероятность того, что тестовый объект будет освобожден до [self saveContext]?

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:[self managedObjectContext]];
for (int i = 0; i < 10; i++) 
{
 Test *test = [[[Test alloc] initWithEntity:entity insertIntoManagedObjectContext:[self managedObjectContext]] autorelease];
 test.text = @"Text";
 test.index = [NSNumber numberWithInt:i];
}
[self saveContext];

Ответы [ 4 ]

1 голос
/ 22 января 2012

Под областью автоматического выпуска я предполагаю, что вы имеете в виду, когда пул автоматического выпуска будет исчерпан.Вы можете определить область автоматического выпуска с помощью синтаксиса:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:[self managedObjectContext]];
@autoreleasepool {
    for (int i = 0; i < 10; i++) 
    {
        Test *test = [[[Test alloc] initWithEntity:entity insertIntoManagedObjectContext:[self managedObjectContext]] autorelease];
        test.text = @"Text";
        test.index = [NSNumber numberWithInt:i];
    }
    [self saveContext];
}

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

1 голос
/ 22 января 2012

да. но я думаю, что это потребует потока.

Каждый раз, когда объект отправляется, -autorelease, он добавляется в пул автоматического выпуска самого высокого уровня. Пока вы не создаете никаких новых пулов автоматического выпуска в методе B или далее в стеке вызовов, пул метода A должен быть пулом самого высокого уровня.

форма здесь Каков размер (вложенных) пулов авто-релиза?

0 голосов
/ 22 января 2012

Проще говоря:
Если вы сами не играете с пулами автоматического выпуска, все ваши объекты находятся в безопасности в методе, функции или блоке.

0 голосов
/ 22 января 2012

Нет, если только при нескольких конкретных обстоятельствах, и давайте выясним, почему.Предполагая, что это в главном потоке, перед вызовом вашего селектора, система создаст для вас NSAutoreleasePool, перед вашей функцией, а затем после.

Так что, если при расширении ваш код выглядит следующим образом:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" 
inManagedObjectContext:[self managedObjectContext]];
for (int i = 0; i < 10; i++) 
{
 Test *test = [[[Test alloc] initWithEntity:entity insertIntoManagedObjectContext:[self managedObjectContext]] autorelease];
 test.text = @"Text";
 test.index = [NSNumber numberWithInt:i];
}
[self saveContext];
[pool drain];

entity будет сброшено сразу после выхода из функции, то есть после [self saveContext].ARC решит многие из этих проблем, если вы решите включить его.

Предупреждение!

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

Также обратите внимание, что при работе с потоками вы должны создать собственный пул автоматического выпуска, система НЕ сделает это за вас.Это не то, что вы делаете здесь, но если такая ситуация возникает, не забудьте обернуть ваш селектор в блок @autorelease.

...