Да, вы правы, пулы авто-релиза не рекомендуются для разработки на iPhone, когда они не являются абсолютно необходимыми. Они не одобряются, потому что это позволяет объектам оставаться в памяти дольше, чем это необходимо, это проблема при разработке приложений для iPhone, где не хватает памяти. Автоматически освобожденные объекты не освобождаются до тех пор, пока они не вернутся в основной пул автоматического выпуска, созданный в main.c, и это может занять много времени. (если вы не создали свой собственный пул автоматического выпуска, я расскажу об этом последним.)
Случай, когда объект автоматического освобождения не требуется:
NSString *string = [NSString stringWithString:@"hello world"];
//use string
Первый случай более удобен , поскольку мне не нужно беспокоиться о выпуске string
позже, но его можно было легко заменить на:
NSString *string = [[NSString alloc] initWithString:@"hello world"];
// use string
[string release];
В этих случаях рекомендуется избегать автоматического освобождения объекта.
Когда вы передаете объекты назад с помощью автоматического выпуска, неизбежен .
Вы должны использовать:
-(NSArray *)findThings {
NSArray* things = [[[NSArray alloc] init] autorelease];
// add some lovely things to my shiny new array
return things;
}
Поскольку объект недействителен, как только вы позвоните release
.
-(NSArray *)findThings {
NSArray* things = [[NSArray alloc] init];
// add some lovely things to my shiny new array
[things release];
// things is now in invalid object if you could potentially use things later it should be set to nil to avoid a crash
things = nil; // sending messages to nil is okay, it won't cause a crash, sending messages to a released object is not okay, it can cause unpredictable crashes.
return things;
}
В тех случаях, когда вы используете большой объем автоматически выпущенной памяти, вы должны создать и истощить свой собственный пул автоматического выпуска, чтобы память автоматического восстановления не оставалась дольше, чем необходимо.
-(void)useLotsOfAutoReleasedObjects {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// lots of autoreleased object
// large autoreleased objects
[pool drain]; // autorelease objects are released too
}
[пул стока] также освобождает пул, для получения дополнительной информации см. NSAutoreleasePool Reference .