Я медленно учу себя какао для iPhone (через Stanford Class на iTunes U ), и я только что прошел часть по управлению памятью, и я хотел, надеюсь, получить некоторое подтверждение того, что мои предположения о том, как обрабатывается память и как работают [release] и [autorelease]. Поскольку управление памятью является действительно базовой и фундаментальной, но очень важной частью опыта программирования, я хотел бы убедиться, что я все делаю правильно.
Я понимаю, что что-либо с alloc, new или copy должно быть выпущено.
Если я сделаю это:
NSString *temp = [[NSString alloc] initWithString:@"Hello World"];
Затем мне нужно со временем добавить [temp release / autorelease], так как у меня есть alloc.
Однако, если я сделаю это:
NSString *temp = @"Hello World";
Тогда, похоже, заявление о выпуске не требуется. Класс NSString вызывает автоматический выпуск как часть назначения?
Кроме того, есть ли разница между двумя * временными объектами здесь после этих утверждений? Они оба содержат одну и ту же строку, но существуют ли способы использования памяти / где они различаются?
Во-вторых, со свойствами я предполагаю, что авто-релиз обрабатывается автоматически. Если у меня есть это:
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property NSString *firstName;
@property NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
//HERE!!!!
[super dealloc];
}
Я предполагаю, что мне не нужно добавлять [firstName release] и [lastName release] (на // ЗДЕСЬ !!!!), так как это автоматически обрабатывается свойствами. Это правильно?
Я понимаю, что если я делаю это в коде (при условии, что я определил initWithFirstName):
Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];
что позже мне придется использовать [Me release / autorelease];
Любая помощь, подтверждающая или исправляющая мое понимание, до сих пор высоко ценится.
ПИСЬМО ОТВЕТА НА ПОСТ
Я думал, что напишу все это после того, как рассмотрю все ответы, опробую предложения и расскажу о том, что сработало.
Мне нужно добавить [firstName release], [lastName release], но мне также нужно добавить (сохранить) в описания свойств. Не добавлять (сохранять) вызванные предупреждения, потому что это предполагает (назначить). Вот как я наконец настроил класс
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
[firstName release];
[lastName release];
[super dealloc];
}