关于 OC 的self = [super init]详解
来源:互联网 发布:sleep函数java 编辑:程序博客网 时间:2024/05/19 17:03
- (MyClass *)init
{
self = [super init];
if
(self) {
//执行一些资源、变量的初始化工作
}
return
self;
}
1、为什么要通过[super init]来调用父类的初始化方法,父类的初始化方法里又执行了什么东西?
首先,我们知道对象继承的概念,一个子类从父类继承,那么也要实现父类的所有功能,这就是isa的关系,比如说狗是哺乳动物,那么狗必定具有哺乳动物的特征和功能。所以在子类的初始化方法中,必须首先调用父类的初始化方法,以实现父类相关资源的初始化。例如我们在初始化狗这一对象时,必须先初始化哺乳动物这一对象,并把结果赋予狗,以使狗满足属于哺乳动物这一特征。
典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成之后,即self不为nil的情况下,就可以开始做子类的初始化了。
2.为什么要用 self 指针指向[ super init] ,大家都知道[ super init] 是调用父类的初始化方法,返回类型是 id 类型,用 self 指向就是为了防止找不到 [super init] 分配的那个内存空间 导致初始化失败, 因此 self 指的不只是自己的初始化属性和方法 还有父类的一些属性和方法
3、是否一定要提供初始化方法,是否一定要使用init作为初始化方法?
我们在Objective-C中创建一个对象通常使用
MyClass *newclass = [[MyClass alloc] init];
MyClass *newclass = [Myclass
new
];
但是,这种方法从设计角度来看我觉得是不可取的。在可复用性方面会比较差,如果确有必要定义一些接受不同参数的初始化方法,我的建议是,先定义一个init的公用方法,再到其他方法中调用它,如:
- (id)init
{
self = [super init];
if
(self) {
}
return
self;
}
- (id)initWithString:(NSString *)aString
{
[self init];
self.name = aString;
}
- (id)initWithImage:(UIImage *)aImage
{
[self init];
self.image = aImage;
}
在面向对象编程中,如果编写一个类而没有包含构造函数,这个类仍能编译并且完全可以正常使用。如果类没有提供显式的构造函数,编译器会提供一个默认的构造函数给你。除了创建对象本身,默认构造函数的唯一工作就是调用其超类的构造函数。在很多情况下,这个超类是语言框架的一部分,如java中的 Object类,objective-c 中的NSObject类。
不论是何种情况,在类中至少包含一个构造函数是一种很好的编程实践,如果类中有属性,好的实践往往是初始化这些属性
- 关于 OC 的self = [super init]详解
- 关于 self = [super init];
- oc中的 if(self=[super init])
- [iOS] 关于 self = [super init];
- [iOS] 关于 self = [super init];
- [iOS] 关于 self = [super init];
- [iOS] 关于 self = [super init];
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]; if (self) { 与 if (self == [super init]) { 的理解
- self = [super init] 引发的思考
- 对 self =[super init]的认识
- if(self = (super init))的理解
- 对 self = [super init] 的理解
- mysql常用命令
- dfs递归过程代码优化
- 工具类3
- 编址与存储相关计算(二)——软考之路
- 数据结构--链式栈(C语言)
- 关于 OC 的self = [super init]详解
- 创建网站的思路
- willMoveToParentViewController和didMoveToParentViewController
- tableviewcell中的badged TDBadgedCell 的实现
- 详细记录python的range()函数用法
- kmp算法实现(C++版)
- NumPy常见函数和使用示例
- hdu 5495 LCS 置换
- hdu 2156 分数矩阵