Object-C 对象初始化
2015-09-25 09:42
459 查看
对象的初始化: Object-C 创建对象分为两个步骤:分配内存、初始化
例:Fraction *frac=[[Fraction alloc] init];
(1.) alloc 是从 NSObject 继承而来的类方法,用于给对象分配存储空间,所有的成员变量在此时对确定了自己的内存位置,并被赋初值,整数类型为 0,浮点数为 0.0,BOOL 为 NO,对象类型为 nil,alloc 方法返回对象的指针。
(2.) init是从NSObject继承而来的成员方法,这个方法是你在对象创建过程可以参与的方法,因此你可以定制自己的 init 方法。Object-C 对 init 方法没有特殊的要求,就是一个普通方法而已,只不过习惯以init 作为方法前缀。一般 init 方法都返回当前类型的指针或者 id 类型。id 类型在 Object-C 中是一个泛型对象,与前面所说的 Class 对象一样,不使用指针作为变量,id
可以表示任意类型的 Object-C 对象。
中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。
比如C#里你可以这么写:
this.hello(true);
在Objective-C里,就要写成:
[self hello:YES];
消息
对象复制
内存管理
初始化是对象创建过程中将新分配对象的状态设置为合理的初始值、使之处于可用状态的阶段。我们应该在内存分配动作完成之后才进行初始化。初始化需通过初始化方法(或者简称初始方法)完成,而只有刚分配的对象才能调用初始化方法。除了初始化任务,初始化方法还能执行其他设置任务,以便让对象进入可用状态。例如您可以在该方法中加载资源或者分配堆内存。
下面给出NSString初始方法声明作为例子:
实现初始化方法的基本步骤如下:
调用超类的初始化方法并检查其返回值。 (请使用保留字super指定超类。) 如果返回值不是nil,即超类的初始化方法返回一个合法的对象,则初始化动作可以继续进行。
为对象的实例变量赋值。在负责管理内存的代码中,如果实例变量自身也是对象,则赋值操作应视情况选择恰当方式,或者复制对象或者保持对象。
返回已完成初始化的对象 ,如果初始化失败则返回nil。
下面给出简单初始化方法,它按照上面的步骤将实例变量date初始化为当前日期:
在上面代码中,如超类返回nil,则该方法将略过初始化动作并直接将nil值返回给调用者。
一个类可能有多个初始化方法。例如初始化数据采用不同的形式,又或者某个初始化方法提供缺省值(出于便捷性的考虑),都会出现这种情况。在多个初始化方法中,有一个被称为指定初始化方法,它需取得完整地初始化参数才可执行。
例:Fraction *frac=[[Fraction alloc] init];
(1.) alloc 是从 NSObject 继承而来的类方法,用于给对象分配存储空间,所有的成员变量在此时对确定了自己的内存位置,并被赋初值,整数类型为 0,浮点数为 0.0,BOOL 为 NO,对象类型为 nil,alloc 方法返回对象的指针。
(2.) init是从NSObject继承而来的成员方法,这个方法是你在对象创建过程可以参与的方法,因此你可以定制自己的 init 方法。Object-C 对 init 方法没有特殊的要求,就是一个普通方法而已,只不过习惯以init 作为方法前缀。一般 init 方法都返回当前类型的指针或者 id 类型。id 类型在 Object-C 中是一个泛型对象,与前面所说的 Class 对象一样,不使用指针作为变量,id
可以表示任意类型的 Object-C 对象。
中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。
比如C#里你可以这么写:
this.hello(true);
在Objective-C里,就要写成:
[self hello:YES];
初始化
预备知识
对象创建消息
相关文章
多初始化方法对象复制
内存管理
初始化是对象创建过程中将新分配对象的状态设置为合理的初始值、使之处于可用状态的阶段。我们应该在内存分配动作完成之后才进行初始化。初始化需通过初始化方法(或者简称初始方法)完成,而只有刚分配的对象才能调用初始化方法。除了初始化任务,初始化方法还能执行其他设置任务,以便让对象进入可用状态。例如您可以在该方法中加载资源或者分配堆内存。
初始方法的声明形式
通过约定,我们要求初始方法以 init开头,并且在成功完成初始化动作的时候,返回一个动态类型对象(id),否则返回nil。初始方法可以包含一个或多个参数用于指定初始值。下面给出NSString初始方法声明作为例子:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding |
实现一个初始化方法
通常情况下,类会实现一个初始方法,以便对象调用,但这不是硬性要求。如果一个类未实现初始化方法,Cocoa会调用其最近父类的初始化方法。不过,子类通常会定义自己的初始化方法或者重载超类的初始化方法,以此来定制初始化过程。如果一个类实现了初始化方法,则初始化过程第一步应调用超类初始化方法。这么做是为确保初始化动作从根对象开始,并且顺着继承链向下进行。NSObject类将init 方法声明为缺省的对象初始化函数,因而该方法总是最后被调用最先返回。实现初始化方法的基本步骤如下:
调用超类的初始化方法并检查其返回值。 (请使用保留字super指定超类。) 如果返回值不是nil,即超类的初始化方法返回一个合法的对象,则初始化动作可以继续进行。
为对象的实例变量赋值。在负责管理内存的代码中,如果实例变量自身也是对象,则赋值操作应视情况选择恰当方式,或者复制对象或者保持对象。
返回已完成初始化的对象 ,如果初始化失败则返回nil。
下面给出简单初始化方法,它按照上面的步骤将实例变量date初始化为当前日期:
- (id)init { |
if (self = [super init]) { // equivalent to "self does not equal nil" |
date = [[NSDate date] retain]; |
} |
return self; |
} |
一个类可能有多个初始化方法。例如初始化数据采用不同的形式,又或者某个初始化方法提供缺省值(出于便捷性的考虑),都会出现这种情况。在多个初始化方法中,有一个被称为指定初始化方法,它需取得完整地初始化参数才可执行。
相关文章推荐
- Object-C 数组(一)(NSArray)
- Object-C 字符串对象
- object-c 字符串(NSString)
- 【IOS 开发学习总结-OC-18】★★objective-c面向对象之——OC的包装类与对象处理
- org.hibernate.NonUniqueObjectException的原因与解决方法
- 黑马程序员--Java基础学习笔记【Object类、String类】
- Object 转 Json (针对父类和数组)
- Objective C静态代码扫描和代码质量管理 OClint + SonarQube
- 2016校招记
- 操作JSONObject中的某一个bean
- 获取JSONObject里所有key
- 【IOS 开发学习总结-OC-17】★★objective-c面向对象之——多态
- Object-c 面向对象(四)
- Object-c 面向对象(三)
- Object-c 面向对象(二)
- Object-c 面向对象(一)
- QT的元对象系统(Meta-Object System)
- Objective-C 学习笔记二
- Objective-c 消息转发机制
- 黑马程序员-----------Objective-C基础-----------OC简介