2013-04-27 35 views
1

对于使用ARC的iOS(以及MacOSX我认为)中的两种可变对象声明,我有理论上的疑问。关于可变对象的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”关键字和“mutableCopy”属性(如第一个示例)对我来说似乎是重复的。我错了吗? 谢谢!

回答

2

强大的财产是一个使用。由于它是一个可变对象(并且被声明为这样),所以你不想复制一个拷贝,因为那样的话[self.myArray addObject:object]就不行。你会使用copy属性来传递可能有可变版本的不可变对象(所以NSString通常是一个复制属性)。

阵列被分配的方式是相当笨拙并且将被更好地写为self.myMutableArray = [NSMutableArray array];

另外,不直接访问该实例变量(使空数组的一个可变拷贝使用目标c文字制造) ,使用属性访问器。

+0

感谢您的解释。然而,随着文字的引入,我经常看到这样的声明: 'self.myMutableArray = [@ [@“One”,@“Two”,@“Three”] mutableCopy];' – nicopasso 2013-04-27 09:32:12

+0

正确的,因为文字是不可变的,这会创建一个可变的副本。 – 2013-04-27 12:53:13

+1

是的,它对于一个包含某些东西的文字数组是有意义的,但对于一个空的数组并不适用。 – jrturton 2013-04-27 14:25:00