Выделение неатомарного копировщика

Я пытаюсь создать неатомарные средства доступа к копии и везде читаю, что объект должен быть освобожден в конце. Так что, если бы вы могли помочь мне понять, правильно ли я это делаю, я был бы признателен. Будет ли следующее правильно?

@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 делает это для вас.

Другие вопросы по тегам