iOS中alloc与init

简介:

面向对象的3大特性,封装继承和多态.

我遇到过封装相关的问题,因为初级封装简单,常常暴露出被你封装的接口,进一步进行高级封装隐藏接口的时候才发现,封装是一门学问,而这门学问得从最基础的alloc与init讲起.

 

FatherModel.h

#import <Foundation/Foundation.h>

@interface FatherModel : NSObject

@end

FatherModel.m
#import "FatherModel.h"

@implementation FatherModel

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"FatherModel");
    }
    return self;
}

@end

SonModel.h
#import "FatherModel.h"

@interface SonModel : FatherModel

@end

SonModel.m
#import "SonModel.h"

@implementation SonModel

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"SonModel");
    }
    return self;
}

@end

先看看 alloc 的API描述解说

+ (id)alloc
Returns a new instance of the receiving class.

返回这个接受消息的类的一个实例.
The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0.

这个实例初始化后可以用来表示这个类的数据相关的结构;所有其他的实例变量的值都被设置成 0.
You must use an init... method to complete the initialization process. For example:

你必须使用 init... 方法来最终完成这个初始化的步骤,如下:
TheClass *newObject = [[TheClass alloc] init];
Do not override alloc to include initialization code. Instead, implement class-specific versions of init... methods.

不要重写 alloc 来包含初始化的代码.你可以使用指定版本的 init... 方法来达到你的目的.
For historical reasons, alloc invokes allocWithZone:.

由于历史原因,allc 方法调用了 allocWithZone: 方法.

 

结论:

1. alloc 后只是在系统中分配了内存,这段内存空间的大小与这个类本身结构所占字节的大小相等,并返回了这段内存的指针.

2. alloc 将申请内存空间中的值都设置为 0.

3. alloc 调用了方法 allocWithZone:.

4. alloc 就执行了一次,没有继承的关系.

 

 

再看看 init 的API描述解说

Implemented by subclasses to initialize a new object (the receiver) immediately after memory for it has been allocated.

子类实现初始化一个刚刚获取到内存空间的对象.
An init message is coupled with an alloc (or allocWithZone:) message in the same line of code:

init 消息与 alloc (或者是 allocWithZone:) 消息在一行内执行:
TheClass *newObject = [[TheClass alloc] init];
An object isn’t ready to be used until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.

对象只有执行了 init 方法后才能够被使用. NSObject 类定义了这个初始化方法,但是 NSObject 并没有初始化什么,它直接将指针返回了.
In a custom implementation of this method, you must invoke super’s designated initializer then initialize and return the new object. If the new object can’t be initialized, the method should return nil. For example, a hypothetical BuiltInCamera class might return nil from its init method if run on a device that has no camera.

如果要自定义这个实现方法.你必须调用 super 来先初始化父类的对象.如果这个新对象不能被初始化,这个方法就应该返回 nil.例如,假设有一个照相机相关的类,如果在一个没有照相机的设备上调用了这个类,那么,在父类的 init 方法中就会返回 nil.
- (id)init {
    self = [super init];
    if (self) {
        // Initialize self.
    }
    return self;
}

 

结论:

1. 重写 init 方法时需要先初始化父类的 init 方法.

2. NSObject 中的 init 方法什么也没做,只是返回了自己而已.

3. 如果初始化失败,会返回 nil.

 

== 测试 ==

仅仅执行 alloc 方法是不是执行 init 方法的,但可以获取一个已经分配了内存空间的地址.

再执行 init 方法后,就会在子类的 init 方法中先调用父类的 init 方法.

-我的一些看法-

1) OC仅仅支持单继承,所以 init 方法是从继承树的顶部 NSObject 开始执行的,每个链路中的对象都会执行一次 init 操作,所以, init 操作会执行多次,至上而下.

2) alloc 就只执行一次.

3) 这些虽然看似简单基础,但对于如何去中等程度的封装一个类是很有用的,因为有时候,你觉得你懂了,可是你在封装一个面向对象的一个类的时候,莫名其妙的崩溃,你就傻眼了,因为我遇到过才会写出来.

4) 封装分为多种,初级封装以及中等程度的封装,初级封装会暴露出被你封装的相关类的信息,比如返回值,入参什么的,属于初级阶段.

目录
相关文章
|
iOS开发
iOS-底层原理 04:NSObject的alloc 源码分析
iOS-底层原理 04:NSObject的alloc 源码分析
105 0
iOS-底层原理 04:NSObject的alloc 源码分析
|
存储 算法 安全
iOS-底层原理 02:alloc & init & new 源码分析
iOS-底层原理 02:alloc & init & new 源码分析
114 0
iOS-底层原理 02:alloc & init & new 源码分析
|
存储 缓存 iOS开发
iOS底层原理:OC对象底层探索之alloc初探(二)
简介: iOS开发的小伙伴们对 [XXX alloc] init] 都不陌生,可以说 alloc 和 init 贯穿我们整个的开发过程中。那么在OC对象的底层,到底做了哪些操作呢?今天我们就来探索一下 alloc 底层的工作流程。
iOS底层原理:OC对象底层探索之alloc初探(二)
|
iOS开发
iOS底层原理:OC对象底层探索之alloc初探(一)
iOS开发的小伙伴们对 [XXX alloc] init] 都不陌生,可以说 alloc 和 init 贯穿我们整个的开发过程中。那么在OC对象的底层,到底做了哪些操作呢?今天我们就来探索一下 alloc 底层的工作流程。
iOS底层原理:OC对象底层探索之alloc初探(一)
|
27天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
83 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
38 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
89 2
|
3月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
42 1
|
1天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
8 0