在上一篇文章《利用__attribute__特性提高 APP 的鲁棒性》中,提及了NS_DESIGNATED_INITIALIZER属性。该属性表示指定初始化方法,今天的主题就是聊一聊NSObject的初始化流程。
初始化分为两步:
- 分配内存
- 初始化对象的成员变量
分配内存
如果有C语言开发经验的人,malloc之后,一般需要memset一下。但在Objective-C里面,可不是这样的。
苹果这段话表达了三个意思:
- 开辟一个内存空间
- isa变量和引用计数
- 将所有的变量初始值置为0
初始化
从上面的描述中,仅仅alloc出来的对象还不能直接使用,还需要调用初始化函数。
以下是NSObject的初始化函数声明:
而这里的init函数是NS_DESIGNATED_INITIALIZER的,也就是指定了初始化函数。
与指定初始化函数(designated initializer)对应的是便利初始化函数(convenience initializers)
接下来分析一个具体的例子:
#import <Foundation/Foundation.h>
@interface P2PBomb : NSObject
@property (copy, nonatomic) dispatch_block_t block;
@property (copy, nonatomic) NSString *capital;
-(instancetype)initWithCount:(NSString *)count NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithCount:(NSString *)count year:(NSInteger)year;
@end
这里声明了一个指定初始化函数initWithCount和一个便利初始化函数:initWithCount:year。
这里给出了三个警告,第一个警告表示父类的指定初始化函数没有找到。第二个和第三个警告表示不能直接调用父类的初始化函数
解决方案如下:
从以上实现可以得出如下结论:
在上一篇文章《 利用__attribute__特性提高 APP 的鲁棒性》中,提及了NS_DESIGNATED_INITIALIZER属性。该属性表示指定初始化方法,今天的主题就是聊一聊NSObject的初始化流程。
初始化分为两步:
- 分配内存
- 初始化对象的成员变量
分配内存
如果有C语言开发经验的人,malloc之后,一般需要memset一下。但在Objective-C里面,可不是这样的。
苹果这段话表达了三个意思:
- 开辟一个内存空间
- isa变量和引用计数
- 将所有的变量初始值置为0
初始化
从上面的描述中,仅仅alloc出来的对象还不能直接使用,还需要调用初始化函数。
以下是NSObject的初始化函数声明:
而这里的init函数是NS_DESIGNATED_INITIALIZER的,也就是指定了初始化函数。
与指定初始化函数(designated initializer)对应的是便利初始化函数(convenience initializers)
接下来分析一个具体的例子:
#import <Foundation/Foundation.h>
@interface P2PBomb : NSObject
@property (copy, nonatomic) dispatch_block_t block;
@property (copy, nonatomic) NSString *capital;
-(instancetype)initWithCount:(NSString *)count NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithCount:(NSString *)count year:(NSInteger)year;
@end
这里声明了一个指定初始化函数initWithCount和一个便利初始化函数:initWithCount:year。
这里给出了三个警告,第一个警告表示父类的指定初始化函数没有找到。第二个和第三个警告表示不能直接调用父类的初始化函数
解决方案如下:
从以上实现可以得出如下结论:
在上一篇文章《 利用__attribute__特性提高 APP 的鲁棒性》中,提及了NS_DESIGNATED_INITIALIZER属性。该属性表示指定初始化方法,今天的主题就是聊一聊NSObject的初始化流程。
初始化分为两步:
- 分配内存
- 初始化对象的成员变量
分配内存
如果有C语言开发经验的人,malloc之后,一般需要memset一下。但在Objective-C里面,可不是这样的。
苹果这段话表达了三个意思:
- 开辟一个内存空间
- isa变量和引用计数
- 将所有的变量初始值置为0
初始化
从上面的描述中,仅仅alloc出来的对象还不能直接使用,还需要调用初始化函数。
以下是NSObject的初始化函数声明:
而这里的init函数是NS_DESIGNATED_INITIALIZER的,也就是指定了初始化函数。
与指定初始化函数(designated initializer)对应的是便利初始化函数(convenience initializers)
接下来分析一个具体的例子:
#import <Foundation/Foundation.h>
@interface P2PBomb : NSObject
@property (copy, nonatomic) dispatch_block_t block;
@property (copy, nonatomic) NSString *capital;
-(instancetype)initWithCount:(NSString *)count NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithCount:(NSString *)count year:(NSInteger)year;
@end
这里声明了一个指定初始化函数initWithCount和一个便利初始化函数:initWithCount:year。
这里给出了三个警告,第一个警告表示父类的指定初始化函数没有找到。第二个和第三个警告表示不能直接调用父类的初始化函数
解决方案如下:
从以上实现可以得出如下结论: