iOS学习笔记之 Objective-C (二)

上一篇文章结尾草草地写了这么个Demo:定义一个Student类,实例化出一个xiaoming的对象,并同时使用pythonjavaObjective-C实现它们。这段代码只是演示了一些最基本的OC语法,但也留下了几个令初学者费解的问题:

  1. NSObject 是什么鬼?
  2. 并没有写构造方法,OC里真的没有构造方法吗?
  3. self是什么鬼?
  4. OC里已经演示了如何继承和封装,但如何实现多态呢?

带着这些问题,我们继续探讨。

Objective-C中的类和NSObject

C语言中有类似对象的结构体,它可以保存一些相关的数据,在OC里则实打实地实现了类的概念。

向类发送alloc消息后就可以为其分配一个对象的内存空间(从语法层面上看,Javapython是没有这一步的)。然而此时对象并没有被“构造”出来,你还需要为其发送init消息。init是什么呢?答:是NSObject对象的构造方法。

初识NSObject

那么NSObject是什么呢?答:它是OC中大多数类的父类。尽管不像单根的java那样是所有类的父类,但我们暂时可以不用在意这些细节。另外要说明一点的就是,OC是单继承的,即一个子类不可能同时继承自多个父类。

诸如allocinit这些方法都是NSObject自带的,因此,理论上说,所有继承自NSObject的子类都会自带这些方法。

于是我们回过头来再看xiaoming的诞生过程,这里面就大有文章了:

   Student *xiaoming = [[Student alloc] init];

   /*
    1. 对Student类发送allc消息,告诉它分配内存;
    2. 调用初始化方法init,完成构造。
    3. 将完成构造的Student对象的内存地址赋给指针变量xiaoming
   */ 

这里的init,实际上就是发送给NSObject发送的消息(或者说是调用了NSObject的构造方法,发送消息这种“术语”,说起来真别扭~)。我们完全可以为自己的类指定自己的初始化方法,但在此之前,先了解一些别的东西。

有一种指针叫id有一种空虚叫nil

id是一个指向任何一个继承了Object(或者NSObject)类的对象,因为可以用来做泛型,有时候也叫泛型指针,但这里所谓泛型的实现方式和java有比较大的差别。

需要注意,id本身就表示指针,所以定义id类型的变量时请务必不要加*,否则会报错。

nilCjava中的NULL相同,代表空对象,nil并不会存在于内存中,所以当*xiaoming=nil时,指针xiaoming将不会指向内存中的任何一个区域。这也是释放内存的方法之一——指向原对象的指针指向nil后,堆内存的那一坨对象就少了一处被引用,如果任何指针都没有引用那坨对象,OC会自动释放那坨对象所占的内存。OC的内存管理我也搞不清,以后再探讨。

还有一种比较少用的首字母大写的Nil,它和nil的区别仅在于前者用来表示指向一个“不存在”的类。nil和Nil在使用上是没有严格限定的,它们俩可以相互替代。

再补充一个东西吧:NSNullnil一样,也表示空,但前者拥有一个有效的内存地址,并且,这货是继承自NSObject的。实际应用中,它常在可变数组这类东东里出现,我们暂时不去深入,知道就好。

selfsuperisa

selfjava中的thispython中的self类似,它是一个指向类或实例本身的指针,id类型。它是类或对象的隐藏参数。

superjavapython中的super一样,表示指向父类,书上说,它是个编译器指示符,不明觉厉,然而这并不影响我们使用。

isa是对象指向自己的类的指针,也是id类型,每一个继承自NSObject的类的实例都有它。

以上只是对NSObject常用的一些概念的简介,并不全。

我们现在可以写一个类的构造方法了,上代码:


#import <Foundation/Foundation.h>

//------  interface ------

@interface Student: NSObject

// 我们用 property 替代 setter/getter
@property NSString *name;

@property int score;
// 声明构造方法1
-(id)initWithName:(NSString *) newName;
// 声明构造方法2
-(instancetype)initWithName:(NSString *) newName Score:(int) newScore;

@end

//------  implementation ------
@implementation Student

@synthesize name = _name; // 让编译器帮你生成getter/setter

@synthesize score = _score;

/* 构造方法1 start */
-(id)initWithName:(NSString *) newName{
  /* 先调用父类指定的初始化方法 */
  self = [super init];

  /* 父类指定的初始化方法是否成功创建了父类对象? */
  if(self){
    // 初始化一些值
    _name = newName;
  }
  // 返回初始化对象的新地址
  return self;
  
}
/* 构造方法1 end */

/* 构造方法2 start */
-(instancetype)initWithName:(NSString *) newName Score:(int) newScore{
  /* 这里可以调用另一个指定的初始化方法 */
  self = [this initWithName:newName];

  /* 父类指定的初始化方法是否成功创建了父类对象? */
  if(self){
    // 初始化一些值
    _score = newScore;
  }
  // 返回初始化对象的新地址
  return self;
  
}
/* 构造方法2 end */

@end

希望通过上述代码,可以了解OC的类是如何实例化对象的,以及了解如何自定义构造方法。这里要说明一点,按照OC的编码习惯,构造方法名,或者叫初始化方法名,都是以init开头的。

我们再举一个栗子,让我们的对象能够返回自己的类:

+ class   
{  
    return self;  // 类方法返回自己
} 
- class  
{  
    return (id)isa;   // 实例通过isa返回类
}

关于NSObject的介绍,这里还不是很全面,接下来该说说OC中的一些常用类型了。

未完待续。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容