【问题标题】:iOS "copy" keyword on Mutable objects可变对象上的 iOS“复制”关键字
【发布时间】:2013-04-27 09:08:10
【问题描述】:

我对使用 ARC 在 iOS(我认为是 MacOSX)中两种类型的可变对象声明存在理论上的疑问。

在类扩展中声明 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”属性(如第一个示例)对我来说似乎是重复的。我错了吗? 谢谢!

【问题讨论】:

    标签: ios


    【解决方案1】:

    strong 属性是要使用的。因为它是一个可变对象(并且被声明为这样),所以你不会想要复制,因为那时像[self.myArray addObject:object] 这样的东西就不起作用了。您可以将 copy 属性用于可能传入了可变版本的不可变对象(因此 NSString 通常是复制属性)。

    数组的分配方式(使用objective-c文字制作空数组的可变副本)非常笨拙,最好写成self.myMutableArray = [NSMutableArray array];

    另外,不要直接访问实例变量,使用属性访问器。

    【讨论】:

    • 感谢您的解释。然而,随着文字的引入,我经常看到这样的声明:self.myMutableArray = [@[@"One", @"Two", @"Three"] mutableCopy];
    • 对,因为字面量是不可变的,这会创建它的可变副本。
    • 是的,它对于包含某些内容的文字数组是有意义的,但对于一个空数组则不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2011-01-17
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2016-05-12
    相关资源
    最近更新 更多