@ вопрос собственности - PullRequest
1 голос
/ 06 марта 2011

В моей реализации у меня есть геттеры и сеттеры, как показано ниже.Я хочу использовать свойства и синтезировать методы получения и установки, но у меня есть несколько вопросов.

- (NSString *)title {
return title;
}

- (void)setTitle:(NSString *)value {
if(title != value) {
    [title release];
    title = [value retain];
}
}

Если бы я преобразовал это в свойство, какие атрибуты я бы использовал?Правильно ли я думаю:

  • readwrite , поэтому присутствуют как геттеры, так и сеттеры
  • retain , так что это увеличивает значение сохранениястрока значения, чтобы объект не потерял ее.

Прав ли я с вышесказанным?

И последнее.У меня есть метод ниже ...

- (void)setReleaseDate:(NSString *)value {
// YYYY-MM-DD HH:MM:SS +HHMM
if([releaseDate description] != value) {
    [releaseDate release];
    releaseDate = [[NSDate alloc] initWithString:value];
}
}

Правильно ли я думаю, что мне все еще нужно включить этот метод, потому что он содержит код, который синтезированный геттер не будет включать?

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 марта 2011

Ваше утверждение об использовании readwrite, а также retain является правильным, так как это создаст семантически эквивалентный код тому, что вы опубликовали.

Установщик свойства releaseate не может быть синтезирован, поскольку вы преобразуете NSString в NSDate для его хранения, что также позволяет избежать распространенных проблем со свойствами NSString, для которых лучше использовать copy чтобы избежать проблем с NSMutableString.

Кроме этого, ваш код в порядке, за исключением того, что для сравнения строк вы можете заменить простую проверку указателя != на isEqualToString, см. Сравнение строк в какао .

1 голос
/ 06 марта 2011

Для вашего свойства title вы можете объявить его в интерфейсе вашего класса следующим образом:

@property (nonatomic, retain) NSString* title;

Что совпадает со следующим:

@property (readwrite, nonatomic) NSString* title;

readwrite является настройкой по умолчанию. В большинстве случаев вам понадобятся сеттеры для ваших свойств, поэтому для тех случаев, когда вы этого не сделаете, вы будете использовать нестандартное значение readonly , чтобы указать это.

Неатомная часть в основном означает, что средства доступа будут быстрее и обычно используются. Вы можете найти больше информации об этом здесь: Что означает свойство "Nonatomic"? .

По второму вопросу вы можете реализовать свои собственные средства доступа, если хотите. Если вы сделаете это, то это как бы «переопределит» метод доступа, который будет сгенерирован Objective-C. Помните, что вы должны соблюдать правила именования. Итак, в вашем примере определенный метод setReleaseDate: будет использоваться для метода установки для свойства releaseDate - что совершенно правильно! :) Проблема, с которой вы столкнулись, заключается в том, что вы передаете * NSString ** для установки даты, что означает, что этот метод не будет переопределять установщик по умолчанию, который будет использоваться, если вы синтезируете свойство. Вы должны передать значение того же типа, что и значение, которое вы устанавливаете в качестве единственного аргумента, поэтому для этого случая вам нужно будет передать * NSDate **.

Вы также должны убедиться, что если вы предоставляете собственную реализацию метода доступа, он выполняет то, что объявлено в интерфейсе. Я предполагаю, что ваше свойство releaseDate должно быть объявлено как сохраняющее.

0 голосов
/ 06 марта 2011

Обычно, хотя и не всегда требуется, использовать семантику copy для свойств NSString, чтобы избежать проблем с изменением объектов NSMutableString за вашей спиной.

В противном случае вы, кажется,на вершине этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...