CLLocationCoordinate2D не является объектом Objective C, поэтому попытка отправить retain
и release
ему не имеет смысла.
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
Здесь объявляется присваиваемое свойство только для чтения, которое является единственно правильным для свойства с простым типом Си. Кроме того, вы сказали, что это nonatomic
, что означает, что нет кода для синхронизации свойства. Поскольку свойство представляет собой структуру, состоящую из двух 64-битных значений, это, вероятно, означает, что вы можете получить противоречивый результат, если прочитаете свойство одновременно с тем, как какой-то другой поток его изменяет.
«сеттер» обычно используется для сеттера, не так ли? так что здесь мы используем установщик, в initWith ...
Нет, не совсем. Линия
coordinate = coord;
фактически назначает переменную экземпляра напрямую. Тем не менее, это то, что вы хотите в этом случае. Если бы свойство не было доступно для чтения / записи и имело тип объекта Objective-C, оно все равно будет напрямую назначать переменную экземпляра. В этом случае вам потребуется одно из следующих действий.
[self setCoordinate: coord];
или
self.coordinate = coord;
или
coordinate = [coord retain]; // in init only
Кстати, ваш init
не так. Следует следовать шаблону:
-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{
self = [super init]; // assuming init is the designated initialiser of the super class
if (self != nil)
{
coordinate = coord;
}
return self;
}