面向对象的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的更多相关文章

  1. IOS基础——alloc、init和new方法

    alloc:分配内存. init:初始化. new:代替上面两个函数:分配内存,并且初始化. 注意: 1.在实际开发中很少会用到new,一般创建对象时我们一般是 [[className alloc]i ...

  2. ios之alloc和init

      复制代码 SomeObject *obj = [[SomeObject alloc] initWithCenter:centerPoint radius:radius]; 和   复制代码 Som ...

  3. iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结

    我要总结的函数主要是这几个: UIView *view-如果view还没有被初始化的话,getter方法会先调用[self loadView],如果getter或者setter方法被重写了,子类中的g ...

  4. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  5. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  6. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

  7. iOS中多线程知识总结(一)

    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序.   ...

  8. RSA算法及其在iOS中的使用

    因为项目中需要传输用户密码,为了安全需要用RSA加密,所以就学习了下RSA加密在iOS中的应用. 关于RSA的历史及原理,下面的两篇文章讲的很清楚了:  http://www.ruanyifeng.c ...

  9. 谈谈iOS中的锁

    1 前言 近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去吧,也有很大一个原因:就是周六没有预约上!闲话少说,这里简单对锁来个简单介绍分享. 2 目录 第 ...

随机推荐

  1. **PHP foreach 如何判断为数组最后一个最高效?

    http://www.zhihu.com/question/20158667 其他方法: $list = array('a', 'b', 'c'); foreach($list as $k=>$ ...

  2. Solr的入门知识

      一.Solr的简介 Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中.都 ...

  3. 【51nod】1773 A国的贸易

    题解 FWT板子题 可以发现 \(dp[i][u] = \sum_{i = 0}^{N - 1} dp[i - 1][u xor (2^i)] + dp[i - 1][u]\) 然后如果把异或提出来可 ...

  4. USACO 4.2 Job Processing

    Job ProcessingIOI'96 A factory is running a production line that requires two operations to be perfo ...

  5. Python全栈开发之12、html

    从今天开始,本系列的文章会开始讲前端,从htnl,css,js等,关于python基础的知识可以看我前面的博文,至于python web框架的知识会在前端学习完后开始更新. 一.html相关概念 ht ...

  6. phpstorm 输入法中文不同步 phpstorm 输入法不跟随光标解决办法

    win7系统新安装的phpstorm2017.2版本,试了很多输入法,要么是不显示候选次,要么是输入法候选词总是在屏幕右下角,没有跟随光标移动.百度很久,重要找到解决方案. 就是替换phpstorm安 ...

  7. IAR环境搭建注意点

    1. include文件添加 Options->C/C++ Compiler 中的Preprocessor中增加一般的头文件 同时 在Assembler中的Preprocessor标签下添加$P ...

  8. 深度学习基础系列(十一)| Keras中图像增强技术详解

    在深度学习中,数据短缺是我们经常面临的一个问题,虽然现在有不少公开数据集,但跟大公司掌握的海量数据集相比,数量上仍然偏少,而某些特定领域的数据采集更是非常困难.根据之前的学习可知,数据量少带来的最直接 ...

  9. ssm框架常见问题

    搭建SSM框架时,总是遇到这样那样的问题,有的一眼就能看出来,有的需要经验的积累.现将自己搭建SSM框架时遇到的典型问题总结如下: 一.Struts2框架下的action中无法使用@Autowired ...

  10. JAVA内存泄漏解决办法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...