OC之构造方法

完整地创建一个可用的对象系统需要进行以下两步:

1.分配存储空间 +alloc

2.初始化 -init

比如创建一个对象:

Person *p = [Person new];

则系统实际上进行了以下两步:

    1.调用+alloc分配存储空间

                  Person *p1 = [Person alloc];

    2.调用-init进行初始化

                                     Person *p2 = [p1 init];

 以上两步可结合成如下形式,并且在实际开发中也是使用如下形式

                  Person *p = [[Person alloc] init];

上述的init方法就是所谓的构造方法

我们也可以重写构造方法init

构造方法:用来初始化对象的方法,是个对象方法,-开头

重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值

重写构造方法的注意点

1.先调用父类的构造方法([super init])

2.再进行子类内部成员变量的初始化

@implementationPerson

/* 重写-init方法

- (id)init

{

1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性

self = [super init]; // 当前对象self

2.如果对象初始化成功,才有必要进行接下来的初始化

    if (self != nil)

    { // 初始化成功

        _age = 10;

    }

    // 3.返回一个已经初始化完毕的对象

    return self;

}*/

- (id)init//写id是为了保证方法可以有任何类型的返回值

{

    if ( self = [super init] )

    { // 初始化成功

        _age = 10;

    }

    // 3.返回一个已经初始化完毕的对象

    return self;

}

@end

【备注】上面代码提到了super,super与self是有区别的,拿java来比较,self就相当于this,super代表调用父类的方法,比如[super test]代表调用父类中的test方法。

关于初始化构造方法详解:

比如初始化构造方法,使Person的对象刚刚创建,Person中的成员变量_age就被初始化为10

当创建一个对象时,如下:

Person*p = [[Person alloc] init];//等价于Person *p = [Person new]

首先调用alloc方法,为每个成员变量分配空间:

在Person的对象中,有_age变量,默认还有一个变量isa,调用alloc方法后,_age和isa将存在于内存空间中,并且默认情况下他们都有一个初值且初值都为0。

然后对象就会调用父类中的init方法,父类之后就会去调用NSObject中的init方法,于是所有成员变量就被重新赋值,_age = 0和isa = [Person class]。即对象的成员变量isa将变成一个指向对象父类的指针。而重写init方法可以给_age重新赋值,可以让_age等于除0以外的值。

所以在重写init方法时一定要判断self = [super init]是否成立,也就是判断是否成功调用了NSObject中的init方法,只有成功调用init方法后才可重写构造方法。

时间: 2024-09-14 05:08:19

OC之构造方法的相关文章

OC语言构造方法

OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象):2)使用init方法来对对象进行初始化. 可以把new方法拆开如下: 1.调用类方法+alloc分配存储空间,返回未经初始化的对象 Person *p1=[person alloc]; 2.调用对象方法-init进行初始化,返回对象本身 Person *p2=[p1

IOS之构造方法与自定义构造方法的区别与实现_IOS

构造方法,也就是int方法,不接受任何的参数,而在实际的开发过程中,为了方便,会经常自定义构造方法.因此,以下分别介绍下构造方法和自定义构造方法的实现. #import <Foundation/Foundation.h> #import "Iphone.h" int main(int argc, const charchar * argv[]) { /* Iphone * phone1 = [Iphone new]; phone1->_cpu = 1.5; phone

objective-c 语法快速过(4)

oc 里的字符串 字符串的快速创建(最简单的方法) NSStirng *str = @"Hello";//oc的字符串都是@""形式的 oc的字符串也是类的对象,是NSString类的对象,创建没有那么麻烦不用[ ],使用面向对象的思想来操纵字符串. char *name = "xxxxx";//c风格字符串 oc使用 %@ 输出字符串,不是%s NSString *name = @"dashuai"; NSLog(@&quo

OC语法总结

1.定义类:@interface 类名 : 父类@end 2.使用:(冒号)表示继承一个类Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法 * 开发工具默认生成的文件为:类名+Catagory名称 * Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定. 4.使用<>表示实现一个Protocol(协议),如需实现多个协议,将协议名

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

WKWebView与Js实战(OC版)

前言 上一篇专门讲解了WKWebView相关的所有类.代理的所有API.那么本篇讲些什么呢?当然是实战了! 本篇文章教大家如何使用WKWebView去实现常用的一些API操作.当然,也会有如何与JS交互的实战. 如果还没有阅读过WKWebView精讲(OC版),请先阅读,不然有可能看不懂下面所讲的内容. 效果图 通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监

WKWebView API精讲(OC)

前言 鉴于LL同志对笔者说:"能不能写个OC版本的WKWebView的使用教程?",还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本篇文章的同志们,应该要感谢LL同志,更要向LL同志学习,积极打赏! WKWebView 看看WKWebView的头文件声明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

OC基础之访问修饰符

做C#.Java的人都知道private.protect.public这些访问权限,在OC中看项目基本都没用到这些,昨天就好奇的仔细了解了下,其实OC中也是有这些访问权限的修饰.说实话有好多做过编程的也未必对这些基础知识了解. 1.分清属性和变量的区别 属性是对变量的封装,可以通过属性(get\set)方法来访问变量.例如有一些变量(例如年龄.性别等)在赋值或取值要满足一些条件,那如何解决呢? 于是属性就应运而生,用它的get.set方法来解决这个问题 ,这也是面向对象中封装的体现. 2.pri

设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C#的API,抽象类,在OC中是没有抽象类.没有多继承关系),<设计模式之禅>里面的代码是JAVA写的,与OC差距也是比较大. 但是我想,这些都不是问题,学习设计模式主要学习的是其中的思想,并将之改造成自己所熟悉语言的模式,大同小异.所需要注意的是,在学习的过程中,将之与语言结合起来,多思考.多实践