Какао преодолевает ограничения AddRef
/ Release
в COM, вводя третьего брата; autorelease
.
retain
- Мне нужно это, заставь это остаться.
release
- мне это больше не нужно, вы можете удалить его немедленно.
autorelease
- мне это не нужно, но позвольте ему подождать несколько секунд, если кто-то другой захочет его забрать первым.
Это крошечное дополнение позволяет обрабатывать большинство возвращаемых значений как если бы у нас была сборка мусора. Если вы не заинтересованы в сохранении возвращаемого значения, просто не делайте ничего лишнего.
Для того, чтобы заставить это работать, существует соглашение (соглашение, достаточно хорошее, чтобы компилятор автоматически выполнял операции памяти для вас с предстоящим ARC) :
- Имена методов, начинающиеся с этих must , возвращают сохраненные экземпляры:
- Все остальные должны возвращать автоматически выпущенные экземпляры.
Три примера реализации того, как это можно применить на практике:
-(NSString*)newHelloWorldString {
NSString* s = [NSString stringWithString:@"Hello world"];
// Apply retain because s in now autoreleased
return [s retain];
}
-(NSString*)helloWorldString {
NSString* s = [[NSString alloc] initWithString:@"Hello world"];
// Apply autorelease because s is now retained.
return [s autorelease];
}
-(NSString*)fullName {
// No memory management needed, everything is autoreleased and good.
NSString* fn = [self firstName];
NSString* ln = [self lastName];
NSString* s = [NSString stringWithFormat:@"%@ %@", fn, ln];
return s;
}