собственность без сохранения с примером - PullRequest
1 голос
/ 18 июля 2011

если мы используем свойство без «retain», что оно меняет?у меня есть этот пример:

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;  
- (id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;

в .m:

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{  
    coordinate = coord;  
    return self;  
}

"retain" обычно используется для сеттера, не так ли?так что здесь, мы используем сеттер в initWith ..., но мы не используем "сохранить" ... любая идея?

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

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;  
}
2 голосов
/ 18 июля 2011

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

В общем случае объекттем не менее, будет сохраняться классом при его выделении и освобождаться при выполнении dealloc.В вашем случае объект типа CLLocationCoordinate2D копируется при присвоении ivar:

 coordinate = coord;

, потому что это не объект-указатель, а простая структура, состоящая из двух двойных:

 typedef double CLLocationDegrees;
 typedef struct {
     CLLocationDegrees latitude;
     CLLocationDegrees longitude;
 } CLLocationCoordinate2D;

Итак, это причина, по которой вы не видите никакого сохранения в коде.Если бы вместо объекта CLLocationCoordinate2D это был NSString, вам, вероятно, потребовалось бы удержание при выполнении задания для ивара.(Я говорю «вероятно», потому что все зависит от владельца назначенного объекта).

1 голос
/ 18 июля 2011

Свойство retain используется для объектов , которые необходимо (неожиданно) сохранить.То есть: вашим объектам нужен объект, назначенный свойству, чтобы остаться, он не может быть освобожден.

В вашем случае это ничего не изменит как структуру, а не объект.

Но в цитируемом коде вы используете readonly, и это означает, что нет установщика, только получатель.

...