Object-C new和alloc/init的区别 ?
参考答案:
在 Objective-C 中,new
、alloc
和 init
是用于创建和初始化对象的常见方法,但它们之间有一些重要的区别。
- alloc/init:
alloc
是一个类方法,用于分配内存给一个对象实例。它返回一个指向新分配但未初始化的对象的指针。
init
是一个实例方法,用于初始化对象。它返回初始化后的对象(通常是 self
)。
通常,你会将这两个方法一起使用来创建一个新的对象实例:
MyClass *myObject = [[MyClass alloc] init];
这行代码首先调用 alloc
来分配内存,然后调用 init
来初始化这个新分配的对象。
2. new:
new
是一个便利方法,它实际上是 alloc
和 init
的组合。当你调用 new
时,它会自动为你调用 alloc
来分配内存,然后调用 init
来初始化对象。因此,以下两行代码是等效的:
MyClass *myObject = [[MyClass alloc] init];
MyClass *myObject = [MyClass new];
注意:
- 如果你重写了
init
方法,并希望提供自定义的初始化逻辑,那么你通常不需要重写new
方法,因为new
只是alloc
和init
的一个包装。 - 你可以通过重写
alloc
或init
方法来控制对象的创建和初始化过程,但这通常是不推荐的,除非你有特殊的需求。 - 如果你需要执行额外的初始化步骤(例如,设置某些属性或执行其他设置),你可能会创建一个自定义的初始化方法(例如
initWithValue:
),然后在这个方法中调用[super init]
。在这种情况下,你仍然可以使用alloc
来分配内存,但你需要直接调用你的自定义初始化方法,而不是init
或new
。
总的来说,alloc/init
提供了更灵活的方式来创建和初始化对象,而 new
是一个更简洁的便利方法。在大多数情况下,你可以使用 new
,但如果你需要更细粒度的控制,那么 alloc/init
可能是更好的选择。