Хорошо, вот предложение.
MyParameter *param = [[MyParam alloc] init];
MyObject *obj = [[MyObject alloc] initWithParam:param]; // do you know if param is retain'd or not?
[param release];
Почему это так?Это шаблон, используемый в ObjC / Cocoa.Вы добавляете объекты в NSArrays следующим образом:
MyThing *thing = [[MyThing alloc] init];
[myMutableArray addObject: thing]; // this calls [thing retain]
[thing release];
Вы также можете попытаться сделать это:
MyObject *obj = [[MyObject alloc] initWithParam: [MyParameter parameter]];
где:
+ (id) parameter
{
return [[[self alloc] init] autorelease];
}
таким образом выне нужно беспокоиться об этом.Это то же самое, что и
[NSData data];
[NSArray array];
Надеюсь, это поможет.Обычно не рекомендуется использовать init
во время вызова другого метода (например, для установки или другого init).Скрытие его за методом класса (+ (id) parameter
) означает, что пользователь знает, что это будет autorelease
'd.
Если вам когда-либо неясно, сколько retain
или release
'Если что-то есть, вы всегда можете сделать что-то вроде этого:
[РЕДАКТИРОВАТЬ]
Предупреждение: Очевидно, вы никогда не должны использовать -retainCount
.Я считаю его полезным для обучения учащихся основам retain
управления памятью, но суть хорошо принята.
Никогда не используйте его в реальном коде или для тестирования производительности. Это используется только для того, чтобы узнать, что делает retain
(и я считаю, что в этом случае оно работает правильно).Он никогда не даст вам интеллектуальный ответ для объекта, который autorelease
'd или дальше retain
' d NSArray
или другими классами Foundation / AppKit / UIKit
MyParameter *param = [[MyParam alloc] init];
NSLog(@"param retain count: %d",[param retainCount]); // should be 1
MyObject *obj = [[MyObject alloc] initWithParam:param];
NSLog(@"param retain count: %d",[param retainCount]); // should be 2, if MyObject retains it.
[param release];
NSLog(@"param retain count: %d",[param retainCount]); // should be 1
Кроме того, когда вы dealloc
MyObject, вам потребуется release
param, если вы retain
сделали это во время инициализации.
Следующее руководство выпущеноApple должна помочь вам лучше понять управление памятью в Objective-C.