Objective-c官方文档翻译 类的定义
类是对象的蓝图。
一个类是描述了对象的行为和属性。例如NSString的一个实例。他的类提供了各种的方法来转化和表示他的内部字符的表示。
每个类的实例都包含了这个类的属性和行为。例如每个NSString类的实例都用相同的方法表示。不管他内部的字符值是多少。
任何特定的对象都是用来被设计用在不同的地方。你可能知道这个字符串对象表示一些字符。但是你不需要知道他的内部机制是怎么来存储字符串的。你不需要知道这个对象怎么来处理字符的,但是你必须知道怎么来和这些对象来交互。也许来请求特殊的字符或者把字符传化为大写的字符。
在Objective-c中接口类是其他对象和这个对象交互的一个公共的接口。
对象的可变性表示他的值是可以改变的
有一些类定义了对象是不可变的。这表示他们的内部内容必须设置当创建的时候。不能被其他的对象改变。在Objective-c所有基于NSString和NSnumber不可变对象的。如果你需要表示其他的数值。你必须创建一个新的实例。
有一些不可变的类提供了可变的版本。如果你需要改变他的内容在运行时。例如有一个字符串对象不可变版本的接受一个网络连接返回的字符串,你可以用NSMutableString的类。这个类的实例除了有NSString的对象行为,还提供了改变这个对象值的功能。
尽管NSString和NSMutableString是不同的类,他们有一些相似的地方。而不是写两个独立的类,而是巧妙利用了继承的特性。
类都是从其他的类继承而来的。
当一个类继承与另一个类,那么这个子类就有父类的行为和属性。他可以有机会来定义自己的新的行为和属性,或者重载父类的行为。举一个例子Objective-c的一个字符类。NSMutableString是从NSString继承而来的就像下面的表。所有在NSString提供的功能在NSMutableString里还是可以用的。例如查询特殊的字符,把新的字符变成大写的。但是NSMutableString添加自己的方法。例如可以拼接插入代替和删除一些字符。
根类提供了最基本的功能:
在Objective-c中有些功能是所有对象都通用的。
当Objective-c对象需要和另一个类的对象实例交互的时候。他希望另一个类提供一些基本的特性和行为。由于这个原因,Objective-c定义了一个根类让所有的类都可以继承叫做NSObject。当一个对象遇到另一个对象的时候,他希望能后用到NSObject类的一些特性。
当你定义你自己的类的时候。你可以让他继承NSObject。通常你看到cocoa 或者 cocoaTouch对象提供了你想继承的功能。
如果你想定义一个自定义的UIButton在你的app里面。例如系统给我们定义了一个UIButton类没有给我们提供足够的自定义属性来满足需求,我们可以自定义一个新类来继承UIButton。如果你继承与NSObject类那么你还需要定义之前UIButton里的一些属性方法。所以我们继承UIButton比较方面。这个UIButton继承UIControl,这个UIControl是用来描述继承的行为对所有用户界面控件在IOS。然后他又继承与UIView,这个UIView又是来把对象展示在你的屏幕上的,UIView继承于UIResponder,来响应用户的手势比如taps,getures或者震动。最后UIResponder继承NSObject。这就是UIButton的继承链。这个继承链表示你的自定义类继承UIButton将不仅仅是继承UIButton本身而且继承了每个父类的父类的功能。我们可以在头文件里看到他的继承关系。
为一个类的接口定义预期的交互:
面向对象的思想用来隐藏他的内部实现。当你定义一个标准的UIButton在IOS app。例如你不需要知道button是怎么显示到屏幕上的。你需要知道的只是你可以改变他的属性,例如他的标题和颜色。并且确保他添加到屏幕上正确的显示。当你定义自己的类的时候。你需要定义他的公有的属性和行为。哪些定义为公有的?你想让这些属性改变吗?其他的对象怎么和你的类交互?
这个接口在你的类里用来提供对象和其他的类交互的方法。公有的接口描述你的类的内部行为,至于实现是在另一个文件里面,你需要做的只是定义公有接口。
我们看一下基本的语法:
@interface myClass:NSObject
@end
这个例子定义一个myclass的类继承于NSObject。公有的属性定义在@interface和@end之间。在这个例子里,他的父类是NSObject因此他现在只有NSObject里的行为和方法。
属性控制着访问对象值的权限:
对象经常有属性来扩展公有的访问。如果你定义一个类来描述人记录他。例如你可以定义两个名字的属性。
@interface myClass:NSObject
@property NSString *name;
@end
在这个例子里这个myClass类定义了两个公有的属性,他们都是NSString的实例。他们都是Objective-c的对象。因此他们用*表示他们是C的指针。就像在C里面一样定义一个变量需要分号结束。
我们定义一个年龄属性@property NSNumber *yearOfBitrh;一个NSNumber对象。我们其实用这个有点大材小用了我们可以用C的基本类型int表示@property int yearsOfBirth;
属性的关键字表明了数据的方法和存储:
这个例子定义了公有属性,所以其他类对象可以读取并且可以访问这些属性的值。在一些例子中属性是不能被改变的只能是只读的。
@interface myClass:NSObject
@property (readonly) NSString *name;
@end
我们以后还会介绍其他的关键字。
方法定义表明这个对象可以接受消息:
在Objective-c一个对象向另一个对象发送消息是调用另一个对象的方法
C结构的方法可能是 void doSomeThing();
在Objective-c里面就是- (void)doSomeThing;这个方法没有任何返回值并且参数。这是一个实例方法用一个实例对象调用。与之相对的是类方法我们接下来会介绍。
方法是可以有参数的:
C语言的方法定义void someFunction(someType value); - (void)someMethodWithValue:(someType)value; 这个方法名字叫做someMethodWithValue: secondValue:
类的名字是唯一的,如果你新建的一个类和已经存在的类的名字重名就会出现编译错误的警告。因此在你的类的前面加上前缀是很明智的。
例如
@interface PHClass:NSObject
@end
你不能在同一个类里面声明两个一样的方法,但是你可以在不同类里面声明相同方法。
实现一个类提供他的内部行为:
一旦你定义了一个接口定义了公有的属性和方法你就得在实现文件里实现他的内部行为。
一个类的头文件就是.h文件他的实现文件是.m
基本语法:
#import"MyClass.h"
@implementation MyClass
@end
如果你定义了很多方法在头文件里面那么你必须实现他们。
@interface MyClass:NSObject
- (void)sayHello;
@end
#import"MyClass"
@implementation MyClass
- (void) sayHello
{
NSLog(@“hello,world”);
}
@end
这个例子用NSLog()功能将日志消息打印到控制台。和C的printf功能类似。可以有好多参数。
类也是对象,没有属性但是有方法,可以用工厂方法发送一个消息给类返回一个这个类的对象。例如:
+(id)string;
具体声明和实现和实例方法是一样的。