Вопрос о сеттере в объективе-c - PullRequest
3 голосов
/ 16 июля 2009

Это пример из языка программирования Objective-C 2.0. Мне просто интересно, в сеттере внизу можно ли использовать value = [newValue retain] вместо value = [newValue copy]?

    @interface MyClass : NSObject

{

    NSString *value;

}

@property(copy, readwrite) NSString *value;

@end



// assume using garbage collection

@implementation MyClass

@dynamic value;



- (NSString *)value {

    return value;

}



- (void)setValue:(NSString *)newValue {

    if (newValue != value) {

       value = [newValue copy];

    }

}

@end

Ответы [ 4 ]

7 голосов
/ 16 июля 2009

Самый быстрый и безопасный способ сделать это - добавить @synthesize value в начало вашей реализации, и компилятор автоматически сгенерирует эти методы.

Проблема копирования против сохранения зависит от того факта, что вы можете быть переданы в NSMutableString, что изменит его значение. Если у вас есть установщик для «неизменяемого» типа (строка, набор, массив, словарь), вам необходимо использовать семантику copy. Поначалу это может показаться нелогичным (зачем делать копию, если она неизменна?), Но нужно понимать, что ваш класс хочет предположить, что она неизменна, а то, что передано, может и не быть неизменным.

Классы NSMutable реализуют селектор copy, возвращая неизменную версию того, что они представляют. Неизменяемые классы (NSString и т. Д.) Реализуют copy с вызовом retain. То есть они очень быстрые.

Ваш сеттер также должен сбросить value, прежде чем присваивать ему новое значение. Правильный код:

-(void)setValue:(NSString*)newvalue
{
    if (value != newvalue)
    {
        [value release];
        value = [newvalue copy];
    }
}

Если у вас есть полный контроль над всеми классами, которые могут вызывать setValue:, и вы абсолютно уверены, что не передадите NSMutableString, вы можете использовать retain, но рекомендуется использовать copy.

0 голосов
/ 22 марта 2014

метод установки:

  -(void)setValue:(NSString*)newvalue{
        if (_value != newvalue)
        {
            [_value release];
            _value = nil;
            _value = [newvalue copy];

        }
   }
0 голосов
/ 16 июля 2009

Это зависит. Если вы используете [newValue retain], другой объект может изменить значение этого указателя NSString. Обычно вам не нравится такое поведение.

0 голосов
/ 16 июля 2009

Нет, ваш интерфейс говорит copy. Если кто-то передает NSMutableString, вы получите очень разные результаты от двух методов.

...