OC中构造方法、自定义构造方法、id类型

一:id类型

1> id 是一种类型,万能指针,能够指向\操作任何的对象。

typedef struct objc_object *id;

注意点:在使用id定义的时候,一定要注意(*)id类型默认已经包含了*所以不需要在加*;

局限性:调用一个不存在的方法,编译器会马上报错。

2>instancetype类型

(1)instancetype会让编译器检查实例化对象的准确类型

(2)instancetype只能用于返回类型,不能当做参数使用

3>.instancetype & id的比较

(1) instancetype在类型表示上,跟id一样,可以表示任何对象类型

(2) instancetype只能用在返回值类型上,不能像id一样用在参数类型上

(3) instancetype比id多一个好处:编译器会检测instancetype的真实类型

二:构造方法

1> 完整的创建一个可用的对象:Person *p=[Person new];

New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始化。

Person *p = [Person new];

// 1 分配空间  2 初始化   3返回地址

Person *p1 = [[Person alloc] init]

//先分配空间

Person *p3 = [Person alloc];

//        p3->name;

p3 = [p3 init];  //

在初始化 init 默认的构造方法,构造方法会把类是成员变量都是初始化为0

也就是所构造方法就是初始化的方法,默认如果我们不重写构造方法的话,默认会调用父类的初始化方法。

为什么要重写构造方法内,当我们需要创建对象就需要对象的成员属性有值。

2>重写构造方法的步骤

//总共分三步:

//1、初始化当前类的实例变量之前,先要初始化父类的

//2、初始化当前类的实例变量

//3、返回

//重写父类的init方法

- (id)init{

if (self = [super init]) {

//初始化当前类的实例变量

_age = 18;

_weight = 50.0f;

}

return self;

}

注意:一定要初始化父类的构造方法,因为父类中得成员变量也需要初始化,比如isa指针。

3>注意点

(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。

(2)原则:先初始化父类的,再初始化子类的。

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

(4)注意点:#1先调用父类的构造方法[super init]; #2再进行子类内部成员变量的初始化。

三:自定义构造方法

实际应用中我们大多采用这种 (自定义构造方法)

1>规范:

1)一定是对象方法,以减号开头

(2)返回值一般是id类型

(3)方法名一般以initWith开头

-(id)initWithName:(NSString *)name andAge:(int)age{

//先做父类的事情

if (self = [super init]) {

//用形参初始化实例变量

_name = name;

_age = age;

}

return self;

}

2>注意:

父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性

3>重写 和 构造方法

重写:指的是将父类的方法重写实现 (子类不需要在声明,其实是内部默认

已经声明)

构造方法:用来初始化对象  (类似与init)但是子类对象的初始化要先对父

类的对象进行初始化操纵

时间: 2024-10-12 12:42:59

OC中构造方法、自定义构造方法、id类型的相关文章

继承中的自定义构造方法

1.继承中的自定义构造方法 不能在子类访问父类私有变量 @interface Person : NSObject @property int age; - (id)initWithAge:(int)age; @end @interface Student : Person @property NSString *name; - (id)initWithAge:(int)age andName:(NSString *)name; @end @implementation Student - (id

OC语法4——自定义构造方法,description方法

自定义构造方法: 我们已经知道创建对象分两步,1:在内存中开辟存储空间,并把地址存储在指针变量里,2:调用指针变量的初始化方法init初始化该对象. Student * stu = [Student alloc]; stu = [stu init]; 在这里,init方法是系统原始的初始化方法,但有时我们需要重写该初始化方法,使其在创建该对象的同时赋予它属性的值. 假如,我们现在要重写原始初始化方法,使其创建一个有年龄(age)的stu. 首先,在Student.h中声明自定义方法: - (id

OC中保存自定义类型对象的持久化方法

OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定义对象必须要序列化(将数据有序的存放) 2. 需要使用归档来进行持久化 3. 如果要加载持久化文件需要进行反序列化(就是将有序存放的数据读取并变成自定义对象) 第一要将自定义类型序列化以及第三步并将文件反序列化必须实现OC中的  <NSCoding>协议. 以Student类为例 @interfa

[转]在Storyboard中使用自定义的segue类型

转自:http://my.oschina.net/u/728866/blog/92709 我们知道segue共有三种类型:push.modal以及custom.如下图: ? 很明显,这三种类型的作用分别是: 使用导航栏压进新的视图控制器: 模态的加载试图控制器: 自定义. 今天说的是最后一个,如何使用自定义的segue类型来实现和push类型一样的效果. 这真的很简单,比当初学UINavigationController可容易多了. 首先,子类化一个UIStoryboardSegue类. 这时已

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [点语法] 1 1.使用“点语法” 2 Student *stu= [[Student alloc]init]; 3         //调用set方法 4         [stu setAge:20]; 5         [stu setName:@"Jone"]; 6         //点语法:xcode的特性,Xcode帮我们做了代码替换 7         //点语法,

OC基础--构造方法 id类型

new方法实现原理: new做了三件事情 1.开辟存储空间  + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Person alloc] init]; alloc: 1.开辟存储空间 2.将所有的属性设置为0 3.返回当前实例对象的地址 init:  1.初始化成员变量, 但是默认情况下init的实现是什么都没有做 2.返回初始化后的实例对象地址 注意: alloc返回的地址, 和init返回的地址是同一个地址

黑马程序员————OC中点语法、id类型和构造方法

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- id:万能指针(内部已经包含*),能指向任何OC对象,只能使用于OC对象   id == NSObject * 构造方法:用来初始化对象的方法,是个对象方法,而且减号开头   init 完整地创建一个可用的对象 1.分配存储空间    +

OC中自定义构造方法

格式 -(instancetype)init(){ self=[super init] if(self){ } return self; } 自定义构造方法规范 1)一定是对象方法,以减号开头 2)返回值一般是id类型 3)方法名一般以initWith开头 带参数的构造方法 -(instatncetype) initWithName:(NSString *) name andAge:(int)age{ if(self=[super init]){ _age=age; _name=name; }

OC的构造方法init以及自定义构造方法

之前我们利用类来创建对象用到了一个类方法new,可是new方法具体是怎么执行的呢?例如 1 Person *p = [Person new]; 程序只要执行了这一行代码,内存中就会有一个Person类和Person对象,并且Person对象的所有实例变量都初始化为0,并且还有个isa指针指向Person类,那么这个对象实际上是通过两部产生的:第一步,调用Person类的alloc类方法分配一定的内存空间给Person对象,它的返回值就是对象本身,实际上也是这一段内存空间的首地址:第二步,调用对象