2013-04-27 4 views
1

У меня теоретическое сомнение в отношении двух типов объявления изменяемого объекта в iOS (и MacOSX, я думаю) с ARC.ключевое слово «копировать» iOS на разрешимых объектах

Какая разница между декларацией в NSMutableArray в расширении класса, как код ниже:

@interface MyViewController() 

@property (copy) NSMutableArray* myMutableArray; 

@end 

//Class implementation 
@implementation MyViewController 
... 
- (void)viewDidLoad 
{ 
    _myMutableArray = [@[] mutableCopy]; 
} 

и заявление того же массива таким образом

@interface MyViewController() 

@property (nonatomic, strong) NSMutableArray* myMutableArray; 

@end 

//Class implementation 
@implementation MyViewController 
... 
- (void)viewDidLoad 
{ 
    _myMutableArray = [@[] mutableCopy]; 
} 

Какой из них лучше? Я видел обе версии и, по-видимому, оба отлично работают. Однако я хотел бы знать, какой из них является лучшим вариантом. Я знаю, что ключевым словом «copy» является использование копии для классов, которые являются частью кластера классов, которые имеют изменяемые/неизменяемые пары. Таким образом, в этом случае он представляется правильным выбором. Но использование ключевого слова «copy» и свойство «mutableCopy» (как и первый пример) кажется для меня дубликатом. Я ошибаюсь? Спасибо!

ответ

2

Сильное свойство - единственное, что нужно использовать. Поскольку его изменяемый объект (и объявляется как таковой), вы не захотите создавать копии, так как тогда такие вещи, как [self.myArray addObject:object], не будут работать. Вы должны использовать свойства copy для неизменяемых объектов, которые могут иметь измененные версии (так что NSString часто является свойством копирования).

Путь массивы присваиваются (изготовление изменяемой копии пустого массива с использованием Objective-C литералы) довольно неуклюжий и будет лучше написан как self.myMutableArray = [NSMutableArray array];

Кроме того, не имеет доступа к переменному экземпляру напрямую , используйте свойство accessor.

+0

Спасибо за объяснение. Однако с введением литералов я часто видел такую ​​декларацию: 'self.myMutableArray = [@ [@" Один ", @" Два ", @" Три "] mutableCopy];' – nicopasso

+0

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

+1

Да, это имеет смысл для буквального массива с чем-то в нем, но не для пустого. – jrturton