Objective-C的对象定义


在objective-c中定义两个类,用于测试对象的定义操作。

首先定义两个类Vehicle和Ship。

@interface Vehicle
- (void)move;
@end

@interface Ship : Vehicle
- (void)shoot;
@end

对象定义操作的方法会有很多,下面罗列一些典型的操作方法。如下所示:

Ship *s = [[Ship alloc] init];
[s shoot];
编译器不会报警,因为向s对象发送消息shoot,其类可以使用shoot方法处理这个消息;

[s move];
编译器不会报警,因为向s对象发送消息move,可以上溯到Ship类的父类Vehicle,使用父类的方法move处理这个消息。这是面向对象开发的继承特性的完美体现。
在编译器编译和运行时执行代码过程中,都不会有任何问题出现。

Vehicle *v = s;
编译器不会报警,因为向s对象所属类的父类就是Vehicle。

[v shoot];
编译器这时会报警,但运行时不会崩溃。因为编译器仅仅知道它是一个Vehicle,而不知道它其实是一个Ship,但是我们自己知道,所以可以这么用。

id obj = ...;
[obj shoot];
编译器不会报警,因为它知道这个shoot方法是存在于整个项目中的。但在运行时,它可能会失败,因为obj不一定是Ship类的对象,虽然它在编译时可能是。

[obj someMethodNameThatNoObjectAnywhereRespondsTo];

编译器会报警了,因为它不知道这个名称如此乱七八糟的方法。因此,运行时也会失败,根本没有对象有这个方法来响应这个消息。

NSString *hello = @”hello”;
[hello shoot];

编译器会报警了,因为它知道NSString没有这个shoot方法。因此,运行时也会失败。

Ship *helloShip = (Ship *)hello;
编译器不会报警。

以上是学习objective-c的一些笔记。

相关内容