一、类的定义 原文地址
类的定义
当你开发OS X或者iOS应用时,你大部分的时间将花费在处理对象。在obj-c中,对象这个概念和其他面向对象语言很相似:对象封装了数据和相关的行为。
一个app本质上就是由很多具有相互联系的对象组成的生态系统,它们一起协同处理特定的问题,比如显示一个虚拟的界面、对用户的输入作出响应,或者存储一些信息。在OS X和ios开发中,解决问题时,其实并不需要东拼西凑的去创建各种对象,只需要掌握库的使用就会事半功倍。(Cocoa库和Cocoa Touch库,分别面向OS X和ios开发)
这些对象中,有一部分可以即插即用,比如基本的数据类型string和numbers,或者是用户界面元素:按钮、表格。你可以按你所需把它们组装在一起,构建你自己的app。
在面向对象系统中,一个对象也叫做一个类的实例。这个章节将会向你介绍,在obj-c中如何定义一个类,通过类的定义,你会指定一系列的规则,并且会由一份代码去实现你指定的规则。
类是对象的蓝图
一个类描述了它实例对象的属性和行为。比如对于一个字符串对象(它是NSString类的实例),它的类声明了很多方法去处理它所表示的字符。同样,数值也是一样。
正如同很多建筑物都出自同一个建筑结构图一样,一个类所有的对象实例,它们的行为都是相同的。比如每一个NSString的实例,无论它存储了什么内容的字符,它们的行为都是一致的。
在具体的场景中,你只需要使用你指定的对象即可,你不必去关心这些对象内部是怎么实现的。你完全没必要去弄清楚一个字符串是怎么存储在内存中,你只需要明白怎么使用这个对象,它会产生什么样符合你预期的输出,你只需弄清楚比如发送某个消息给字符串对象,让它转成大写字母后返回给你等等,如此而已。
在obj-c中,类的interface准确的定义了这个类的实例,换句话说,类的interface定义了这个类的实例对象怎么与其他对象进行通信交互。
可变性决定了被表示的值是否可以改变
有这样一些类,它定义出来的对象是不可变的。这句话的意思就是,这些对象的值必须在创建对象时就完成指定,而不能在后续程序运行的时候修改它。在obj-c中,基础的NSString和NSNumber都是不可变的,如果你需要表示另一个数值,你必须使用一个新的NSNumber实例。
有些不可变的类同样提供了可变版本。如果你需要在运行时改变对象的值,比如向一个现有的字符串里追加字符,你可以使用NSMutableString类。这个类的实例对象和NSString对象很相似,它们的区别就在于,NSMutableString提供了动态修改值的功能。
在这里,尽管NSString和NSMutableString是两个不同的类,但他们有很多相同点。所以与其写两套完全不同的实现代码,不如使用继承的特性把他们连起来。
继承其他的类
在自然界里,我们通过门纲科等分类来划分不同的生物。
比如大猩猩,人类和猩猩,他们有很多相似之处,又属于不同的生物。但追根溯源,我们把他们都归为“人科”。具体可参见下图1-1.

在面向对象的世界里,对象也和自然界的生物一样,被按照相似的法则,做出了各自的划分。子类会拥有父类的特性,就好比大猩猩拥有“人科”的特性一样。
当一个类继承了其他的类,那么它就拥有了父类的全部行为和属性,同时它也有机会去指定它自己的额外的行为和属性,甚至去覆盖它父类的行为。
举例来说,obj-c中的字符串类,NSMutableString就是继承了NSString,参考图1-2,NSString类中的所有功能,在NSMutableString中都能找到,但NSMutableString提供了一些新的方法,让你可以对原有字符串进行追加,插入,替换或者删除。

根类提供基础功能
就像所有活着的生物都有“生命”这个特性,obj-c中的所有对象也是具有共同特性的。
当一个obj-c对象需要和其他对象协同工作时,它需要其他的对象提供出一些基础的特性和行为。基于这个原因,obj-c定义了一个根类NSObject,几乎所有的类都继承于此。
当你定义你自己的类时,你至少需要继承自NSObject。一般来说,你需要查找cocoa或者cocoa touch库,找到和你需求最接近的类,然后继承它。
举例来说,在ios app中,如果UIButton类没有提供足够的能力支持你的开发,你就需要自定义一个按钮类,让它继承UIButton。在这里如果你让它继承自NSObject类,那么你就悲剧了,你不得不把UIButton的所有实现都自己重做一遍,这是在浪费时间。
UIButton类继承自UIControl类,UIControl类描述了用户界面的基础控制行为。而UIControl类又继承于UIView类,UIView类提供了显示到界面的相关功能。UIView类继承于UIResponder类,UIResponder类提供了对于用户触摸、手势、摇晃的响应支持。最终,UIResponder继承了NSObject类。具体参考1-3。

这个继承链意味着,所有的子类可以获得所有父类的能力,包括爷爷类、祖先类的能力。
你在使用任何类时,记住他的继承链是很重要的,它能让你准确知道这个类能做什么。如果你寻找的东西不在这个类里,那么它很有可能在它的父类,或者更深的父类中定义了,你可以去那里试试看。
一、类的定义 原文地址
类的定义
当你开发OS X或者iOS应用时,你大部分的时间将花费在处理对象。在obj-c中,对象这个概念和其他面向对象语言很相似:对象封装了数据和相关的行为。
一个app本质上就是由很多具有相互联系的对象组成的生态系统,它们一起协同处理特定的问题,比如显示一个虚拟的界面、对用户的输入作出响应,或者存储一些信息。在OS X和ios开发中,解决问题时,其实并不需要东拼西凑的去创建各种对象,只需要掌握库的使用就会事半功倍。(Cocoa库和Cocoa Touch库,分别面向OS X和ios开发)
这些对象中,有一部分可以即插即用,比如基本的数据类型string和numbers,或者是用户界面元素:按钮、表格。你可以按你所需把它们组装在一起,构建你自己的app。
在面向对象系统中,一个对象也叫做一个类的实例。这个章节将会向你介绍,在obj-c中如何定义一个类,通过类的定义,你会指定一系列的规则,并且会由一份代码去实现你指定的规则。
类是对象的蓝图
一个类描述了它实例对象的属性和行为。比如对于一个字符串对象(它是NSString类的实例),它的类声明了很多方法去处理它所表示的字符。同样,数值也是一样。
正如同很多建筑物都出自同一个建筑结构图一样,一个类所有的对象实例,它们的行为都是相同的。比如每一个NSString的实例,无论它存储了什么内容的字符,它们的行为都是一致的。
在具体的场景中,你只需要使用你指定的对象即可,你不必去关心这些对象内部是怎么实现的。你完全没必要去弄清楚一个字符串是怎么存储在内存中,你只需要明白怎么使用这个对象,它会产生什么样符合你预期的输出,你只需弄清楚比如发送某个消息给字符串对象,让它转成大写字母后返回给你等等,如此而已。
在obj-c中,类的interface准确的定义了这个类的实例,换句话说,类的interface定义了这个类的实例对象怎么与其他对象进行通信交互。
可变性决定了被表示的值是否可以改变
有这样一些类,它定义出来的对象是不可变的。这句话的意思就是,这些对象的值必须在创建对象时就完成指定,而不能在后续程序运行的时候修改它。在obj-c中,基础的NSString和NSNumber都是不可变的,如果你需要表示另一个数值,你必须使用一个新的NSNumber实例。
有些不可变的类同样提供了可变版本。如果你需要在运行时改变对象的值,比如向一个现有的字符串里追加字符,你可以使用NSMutableString类。这个类的实例对象和NSString对象很相似,它们的区别就在于,NSMutableString提供了动态修改值的功能。
在这里,尽管NSString和NSMutableString是两个不同的类,但他们有很多相同点。所以与其写两套完全不同的实现代码,不如使用继承的特性把他们连起来。
继承其他的类
在自然界里,我们通过门纲科等分类来划分不同的生物。
比如大猩猩,人类和猩猩,他们有很多相似之处,又属于不同的生物。但追根溯源,我们把他们都归为“人科”。具体可参见下图1-1.
在面向对象的世界里,对象也和自然界的生物一样,被按照相似的法则,做出了各自的划分。子类会拥有父类的特性,就好比大猩猩拥有“人科”的特性一样。
当一个类继承了其他的类,那么它就拥有了父类的全部行为和属性,同时它也有机会去指定它自己的额外的行为和属性,甚至去覆盖它父类的行为。
举例来说,obj-c中的字符串类,NSMutableString就是继承了NSString,参考图1-2,NSString类中的所有功能,在NSMutableString中都能找到,但NSMutableString提供了一些新的方法,让你可以对原有字符串进行追加,插入,替换或者删除。
根类提供基础功能
就像所有活着的生物都有“生命”这个特性,obj-c中的所有对象也是具有共同特性的。
当一个obj-c对象需要和其他对象协同工作时,它需要其他的对象提供出一些基础的特性和行为。基于这个原因,obj-c定义了一个根类NSObject,几乎所有的类都继承于此。
当你定义你自己的类时,你至少需要继承自NSObject。一般来说,你需要查找cocoa或者cocoa touch库,找到和你需求最接近的类,然后继承它。
举例来说,在ios app中,如果UIButton类没有提供足够的能力支持你的开发,你就需要自定义一个按钮类,让它继承UIButton。在这里如果你让它继承自NSObject类,那么你就悲剧了,你不得不把UIButton的所有实现都自己重做一遍,这是在浪费时间。
UIButton类继承自UIControl类,UIControl类描述了用户界面的基础控制行为。而UIControl类又继承于UIView类,UIView类提供了显示到界面的相关功能。UIView类继承于UIResponder类,UIResponder类提供了对于用户触摸、手势、摇晃的响应支持。最终,UIResponder继承了NSObject类。具体参考1-3。
这个继承链意味着,所有的子类可以获得所有父类的能力,包括爷爷类、祖先类的能力。
你在使用任何类时,记住他的继承链是很重要的,它能让你准确知道这个类能做什么。如果你寻找的东西不在这个类里,那么它很有可能在它的父类,或者更深的父类中定义了,你可以去那里试试看。