📜  Objective-C类和对象

📅  最后修改于: 2020-11-03 16:00:16             🧑  作者: Mango


Objective-C编程语言的主要目的是向C编程语言添加面向对象的类,这些类是Objective-C的主要功能,它们支持面向对象的编程,通常被称为用户定义类型。

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

Objective-C特性

  • 该类在两个不同的部分定义,即@interface@implementation

  • 几乎所有事物都是对象形式。

  • 对象接收消息,而对象通常称为接收者。

  • 对象包含实例变量。

  • 对象和实例变量具有作用域。

  • 类隐藏对象的实现。

  • 属性用于提供对其他类中的类实例变量的访问。

Objective-C类定义

定义类时,将为数据类型定义一个蓝图。这实际上并没有定义任何数据,但是确实定义了类名的含义,即,类的对象将由什么组成,以及可以对该对象执行什么操作。

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

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@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 

@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;
}

编译并执行上述代码后,将产生以下结果-

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

物产

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

各部分的属性声明如下。

  • 属性以@property开头,这是一个关键字

  • 它后面是访问说明符,这些说明符是非原子的或原子的,可读写的或只读的以及强,unsafe_unretained或weak。这取决于变量的类型。对于任何指针类型,我们都可以使用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;