Objective-C 类和对象

  • 类和对象

    Objective-C编程语言的主要目的是向C编程语言添加面向对象的类,这些类是Objective-C的主要功能,它们支持面向对象的编程,通常被称为用户定义类型。一个类用于指定对象的形式,它结合了数据表示形式和用于将该数据处理到一个整齐的包中的方法。类中的数据和方法称为该类的成员。
  • Objective-C特性

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

    定义类时,将为数据类型定义一个蓝图。这实际上并没有定义任何数据,但确实定义了类名的含义,即,类的对象将由什么组成,以及可以对该对象执行哪些操作。类定义以关键字@interface开头,后接interface(class)名称; 和类体体,用大括号括起来。在Objective-C中,所有类都是从称为NSObject的基类派生的。它是所有Objective-C类的超类。它提供了诸如内存分配和初始化之类的基本方法。例如,我们使用关键字类定义Box数据类型,如下所示:
    
    @interface Box:NSObject {
       //实例变量
       double length;    // Length of a box
       double breadth;   // Breadth of a box
    }
    @property(nonatomic, readwrite) double height;  // 属性
    
    @end
    
    实例变量是私有的,只能在类实现内部访问。
  • 分配和初始化Objective-C对象

    类提供了对象的设计图,因此基本上是从类创建对象的。我们使用与声明基本类型的变量完全相同的声明类型来声明类的对象。以下语句声明Box类的两个对象-
    
    Box box1 = [[Box alloc]init];     // Create box1 object of type Box
    Box box2 = [[Box alloc]init];     // Create box2 object of type Box
    
    对象box1和box2都将拥有自己的数据成员副本。
  • 访问数据成员

    可以使用直接成员访问运算符(.)访问类的对象的属性。让我们尝试以下示例以使事情变得清晰起来-
    
    #import <Foundation/Foundation.h>
    
    @interface Box:NSObject {
       double length;    // Length of a box
       double breadth;   // Breadth of a box
       double height;    // Height of a box
    }
    
    @property(nonatomic, readwrite) double height;  // Property
    -(double) volume;
    @end
    
    @implementation Box
    
    @synthesize height; 
    
    -(id)init {
       self = [super init];
       length = 1.0;
       breadth = 1.0;
       return self;
    }
    
    -(double) volume {
       return length*breadth*height;
    }
    
    @end
    
    int main() {
       NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
       Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
       Box *box2 = [[Box alloc]init];    // Create box2 object of type Box
    
       double volume = 0.0;             // Store the volume of a box here
     
       // box 1 specification
       box1.height = 5.0; 
    
       // box 2 specification
       box2.height = 10.0;
      
       // volume of box 1
       volume = [box1 volume];
       NSLog(@"Volume of Box1 : %f", volume);
       
       // volume of box 2
       volume = [box2 volume];
       NSLog(@"Volume of Box2 : %f", volume);
       
       [pool drain];
       return 0;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-20 10:01:22.833 helloWorld[4684:13544] Volume of Box1 : 5.000000
    2020-08-20 10:01:22.842 helloWorld[4684:13544] Volume of Box2 : 10.000000
    
  • 属性

    在Objective-C中引入了属性,以确保可以在类外部访问类的实例变量。各部分的属性声明如下。
    属性以@property开头,这是一个关键字,它后面是访问说明符,这些说明符是非原子的或原子的,读写或只读的,强的,unsafe_unretained或弱的。这取决于变量的类型。对于任何指针类型,我们都可以使用strong,unsafe_unretained或weak。同样,对于其他类型,我们可以使用readwrite或readonly。其后是变量的数据类型。最后,我们使用分号将属性名称终止。我们可以在实现类中添加synthesize语句。但是在最新的XCode中,XCode负责综合部分,您无需包含synthesize语句。只有通过属性,我们才能访问类的实例变量。实际上,内部getter和setter方法是为属性创建的。例如,假设我们有一个属性@property(nonatomic,readonly)BOOL isDone在类下,创建了setter和getter,如下所示。
    
    -(void)setIsDone(BOOL)isDone;
    -(BOOL)isDone;