Выделение неатомарного копировщика
Я пытаюсь создать неатомарные средства доступа к копии и везде читаю, что объект должен быть освобожден в конце. Так что, если бы вы могли помочь мне понять, правильно ли я это делаю, я был бы признателен. Будет ли следующее правильно?
@interface ClassA: NSObject
{
NSString* stringA;
}
@property (nonatomic, copy) NSString* stringA;
@implementation ClassA
@synthesize stringA;
-(void) setStringA: (NSString*) stringInput {
if(stringA != stringInput) {
[stringA release];
stringA = [stringInput copy];
}
}
-(void) dealloc {
[stringA release];
[super dealloc];
}
Я ищу подтверждение того, нужно ли мне освобождать stringA в методе dealloc в конце и правильно ли я это сделал.
Большое спасибо.
2 ответа
Вы должны выпустить это, да. (Вы не освобождаете вещи. Вы отказываетесь от прав собственности на них, и в результате они могут быть освобождены.)
Ваш код правильный.
Правила таковы, что вы должны освобождать любой объект, который вы получаете от метода, имя которого начинается с "alloc" или "new" или содержит "copy". Вы также должны освободить любой объект, который у вас есть. Так как вы звоните -copy
на stringInput
Вы несете ответственность за то, что в конечном итоге освободите объект, полученный от этого.
@ Кен Томасес прав; ваш код правильный. Несколько вещей, хотя:
Вам действительно не нужно объявлять ivar, или синтезировать свойство, или писать свой собственный установщик; Все это сделано для вас. Таким образом, ваш код (хотя и правильный) может быть упрощен до:
@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end
@implementation ClassA
-(void) dealloc {
[_stringA release];
[super dealloc];
}
@end
Во-вторых, если вы используете ARC (что я рекомендую), код можно еще больше упростить (полностью удалив переопределение dealloc).
@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end
@implementation ClassA
@end
В этом случае stringA освобождается вашим классом на dealloc, но вам не нужно писать код для этого; ARC делает это для вас.