面试题答案
一键面试1. alloc
和 init
分开调用
- 区别:
alloc
方法主要负责为对象分配内存空间,并将对象的所有实例变量初始化为 0 或nil
。而init
方法用于对已分配内存的对象进行进一步的初始化操作,例如设置默认值、建立初始状态等。这种分开调用的方式,让开发者可以更灵活地控制对象初始化的过程。 - 举例:假设我们有一个自定义的
Person
类,包含name
和age
两个属性。
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation Person
- (instancetype)init {
self = [super init];
if (self) {
_name = @"Unknown";
_age = 0;
}
return self;
}
@end
// 使用场景及创建方式
Person *person1 = [Person alloc];
person1 = [person1 init];
在这个场景下,如果我们的初始化逻辑比较简单,并且希望在分配内存和初始化之间进行一些额外的操作(虽然不常见,但理论上可行),就可以使用这种方式。
2. [[Class alloc] initWithXXX]
方式
- 区别:这是一种更简洁的创建对象并同时进行特定初始化的方式。
initWithXXX
是自定义的初始化方法,其中XXX
表示根据具体需求定义的参数。这种方式将内存分配和特定的初始化一步完成,代码更加紧凑。 - 举例:继续以
Person
类为例,我们添加一个带参数的初始化方法。
@implementation Person
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
self = [super init];
if (self) {
_name = name;
_age = age;
}
return self;
}
@end
// 使用场景及创建方式
Person *person2 = [[Person alloc] initWithName:@"John" age:30];
当我们创建对象时需要传递特定的初始值,并且希望代码更简洁时,就适合使用 [[Class alloc] initWithXXX]
这种方式。比如在创建一个需要特定配置的视图控制器时,传递初始数据给视图控制器的属性。例如创建一个 DetailViewController
,需要传递一个 model
对象来显示详细信息:
DetailViewController *detailVC = [[DetailViewController alloc] initWithModel:specificModel];
总结来说,如果初始化逻辑简单且可能需要在分配内存和初始化之间做额外操作,可选择 alloc
和 init
分开调用;如果需要传递特定参数进行初始化且追求代码简洁,[[Class alloc] initWithXXX]
是更好的选择。