Objective-C 类与对象

Objective-C 编程语言的主要目的是将面向对象添加到 C 编程语言中,类是 Objective-C 的核心功能,支持面向对象编程,通常称为用户定义类型。

类用于指定对象的形式,它将数据表示和处理数据的方法组合到一个包中。类中的数据和方法称为类的成员。


Objective-C 特点

  • 类要在两个不同的部分中定义,即 @interface@implementation
  • 几乎所有东西都是对象的形式。
  • 对象接收消息,对象通常称为 receiver。
  • 对象包含实例变量。
  • 对象和实例变量具有作用域。
  • 类隐藏对象的实现。
  • 属性用于提供对其他类中的类实例变量的访问。

Objective-C 类定义

定义类时,定义数据类型的蓝图。这实际上并不定义任何数据,但它定义了类名的含义,即类的对象将由什么组成,以及可以对此类对象执行什么操作。

类定义以关键字 @interface 开头,后跟接口(类)名称;和类主体,由一对花括号括起来。在 Objective-C 中,所有类都是从名为 NSObject 的基类派生的。它是所有 Objective-C 类的超类。它提供了内存分配和初始化等基本方法。例如,我们使用关键字 class 定义了 Box 数据类型,如下所示:

  1. @interface Box:NSObject {
  2. //Instance variables
  3. double length; // Length of a box
  4. double breadth; // Breadth of a box
  5. }
  6. @property(nonatomic, readwrite) double height; // Property
  7. @end

实例变量是私有的,只能在类实现内部访问。


分配和初始化 Objective-C 对象

类提供了对象的蓝图,因此基本上是从类创建对象。我们使用与我们声明基本类型变量完全相同的声明类型来声明类的对象。下面的语句声明了 Box 类的两个对象:

  1. Box box1 = [[Box alloc]init]; // Create box1 object of type Box
  2. Box box2 = [[Box alloc]init]; // Create box2 object of type Box

对象 box1box2 都将拥有自己的数据成员副本。


访问数据成员

可以使用直接成员访问运算符(.)访问类对象的属性。让我们尝试下面的例子来说明问题:

  1. #import <Foundation/Foundation.h>
  2. @interface Box:NSObject {
  3. double length; // Length of a box
  4. double breadth; // Breadth of a box
  5. double height; // Height of a box
  6. }
  7. @property(nonatomic, readwrite) double height; // Property
  8. -(double) volume;
  9. @end
  10. @implementation Box
  11. @synthesize height;
  12. -(id)init {
  13. self = [super init];
  14. length = 1.0;
  15. breadth = 1.0;
  16. return self;
  17. }
  18. -(double) volume {
  19. return length*breadth*height;
  20. }
  21. @end
  22. int main() {
  23. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  24. Box *box1 = [[Box alloc]init]; // Create box1 object of type Box
  25. Box *box2 = [[Box alloc]init]; // Create box2 object of type Box
  26. double volume = 0.0; // Store the volume of a box here
  27. // box 1 specification
  28. box1.height = 5.0;
  29. // box 2 specification
  30. box2.height = 10.0;
  31. // volume of box 1
  32. volume = [box1 volume];
  33. NSLog(@"Volume of Box1 : %f", volume);
  34. // volume of box 2
  35. volume = [box2 volume];
  36. NSLog(@"Volume of Box2 : %f", volume);
  37. [pool drain];
  38. return 0;
  39. }

当编译和执行上述代码时,它会产生以下结果:

  1. 2022-07-07 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
  2. 2022-07-07 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

属性

Objective-C 中引入了属性,以确保类的实例变量可以在类外部访问。

属性声明的各个部分如下所示。

  • 属性以 @property 开头,这是一个关键字
  • 其次是访问修饰符,它们是原子性的或非原子性的、可读写的或只读的、强的、不安全的、弱的。这都取决于变量的类型。对于任何指针类型,我们都可以使用 strongunsafe_unretainedweak。类似地,对于其他类型,我们可以使用 readwritereadonly
  • 然后是变量的数据类型。
  • 最后,属性名以分号结尾。
  • 我们可以在实现类中添加 Synthesis 语句。但是在最新的 XCode 中,合成部分由 XCode 负责,您不需要包含 synthesis 语句。

只有通过属性,我们才能访问类的实例变量。实际上,在内部为属性创建了 gettersetter 方法。

例如,假设我们有一个属性 @property(nonatomic,readonly)BOOL isDone。然后创建了 settergetter,如下所示。

  1. -(void)setIsDone(BOOL)isDone;
  2. -(BOOL)isDone;