Вопрос

Это пример из языка программирования 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
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

        }
   }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top