Для вашего свойства title вы можете объявить его в интерфейсе вашего класса следующим образом:
@property (nonatomic, retain) NSString* title;
Что совпадает со следующим:
@property (readwrite, nonatomic) NSString* title;
readwrite является настройкой по умолчанию. В большинстве случаев вам понадобятся сеттеры для ваших свойств, поэтому для тех случаев, когда вы этого не сделаете, вы будете использовать нестандартное значение readonly , чтобы указать это.
Неатомная часть в основном означает, что средства доступа будут быстрее и обычно используются. Вы можете найти больше информации об этом здесь: Что означает свойство "Nonatomic"? .
По второму вопросу вы можете реализовать свои собственные средства доступа, если хотите. Если вы сделаете это, то это как бы «переопределит» метод доступа, который будет сгенерирован Objective-C. Помните, что вы должны соблюдать правила именования. Итак, в вашем примере определенный метод setReleaseDate: будет использоваться для метода установки для свойства releaseDate - что совершенно правильно! :) Проблема, с которой вы столкнулись, заключается в том, что вы передаете * NSString ** для установки даты, что означает, что этот метод не будет переопределять установщик по умолчанию, который будет использоваться, если вы синтезируете свойство. Вы должны передать значение того же типа, что и значение, которое вы устанавливаете в качестве единственного аргумента, поэтому для этого случая вам нужно будет передать * NSDate **.
Вы также должны убедиться, что если вы предоставляете собственную реализацию метода доступа, он выполняет то, что объявлено в интерфейсе. Я предполагаю, что ваше свойство releaseDate должно быть объявлено как сохраняющее.