alloc init vs Convenience初始化程序用于强属性

时间:2013-09-17 10:31:25

标签: objective-c automatic-ref-counting

所以在我的一个Objective C课程中,我有一个强大的属性说:

@property(nonatomic, strong) NSMutableArray     *tags;

以下哪项是初始化此属性的更好方法

1 self.tags = [[NSMutableArray alloc] init];

2 self.tags = [NSMutableArray array];

2 个答案:

答案 0 :(得分:3)

使用ARC,几乎没有区别。 [NSMutableArray array]返回一个"unretained return value",它可能已被放入自动释放池中(实际发生了这种情况 在您的示例中,您可以通过检查生成的Assembler代码来查看。

当前自动释放池结束时,此附加引用将在稍后发布。 所以第二种方法有一点点开销。

另一方面,Objective-C 运行时有各种方法可以避免不必要的 保留/释放调用(例如通过检查调用堆栈),因此差异可以忽略不计。

答案 1 :(得分:0)

这取决于你对更好的定义。首先,如果您使用init方法,则不应使用self.tags =进行分配,因为您不应该使用init方法调用方法。而是直接访问实例变量:

_tags = ...;

至于可能的方法:

_tags = [[NSMutableArray alloc] init];

目前比

快一点
_tags = [NSMutableArray array];

但也更长。我们永远不应该针对我们没有测量过的性能问题进行优化。如果你想要可读性和短代码,我会建议第三种选择:

_tags = [NSMutableArray new];

事实上,你可以拥有更短的代码,但它可能让你的眼睛流血:

_tags = [@[] mutableCopy];

额外跟踪:早期在ARC中,对象属性的默认值为assign,但它变得非常快strong。而不是

@property(nonatomic, strong) NSMutableArray *tags;

你可以使用

@property(nonatomic) NSMutableArray *tags;