iOS中alloc与init

2024-09-05 13:48
文章标签 init ios alloc

本文主要是介绍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中alloc与init的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139137

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑

4.15 版本内核调用 init_timer()函数出错

linux/include/linux/timer.h4.15 之前版本struct timer_list {14 /*15 * All fields that change during normal runtime grouped to the16 * same cacheline17 */18 struct hl