在Objective-C中分类对象和方法

时间:2020-02-23 14:29:54  来源:igfitidea点击:

在本教程中,我们将简要概述类和对象及其在Objective-C编程中的用法。

说明

在面向对象的程序设计中,类表示对象的蓝图,在此没有区别。
通常,在Objective-C代码中,一个类在两个文件中表示。
头文件和实现文件。

头文件是类的接口,它定义了类中使用的属性和方法。
实现文件包含将这些属性和方法付诸实践的代码。

头文件被其他类用于与当前类进行交互。
实现文件是每个类专用的。
头文件在@interface下定义,实现类在@implementation下定义。

使用XCode在Objective-C中创建类

让我们在新的XCode项目中创建一个新的Custom类。
以下是创建相同文件的步骤。

我们创建了一个示例项目来计算身体最大指数(BMI)并将其显示在命令行中。
现在,导航侧列的BMI文件夹中有一个名为main.m的文件。
要添加头文件,请右键单击BMI文件夹->新建文件..。
弹出对话框,选择文件类型。
在这种情况下,选择头文件。
之后,输入文件名并选择属性,如下图所示:

您可以在导航侧列中看到main.h文件。
所有带有.h文件扩展名的文件都是头文件,并且包含类的接口。
.m扩展文件是实现文件。

接口文件

当前接口文件为空。
导入Foundation Framework并添加接口指令@interface后,它应如下图所示

在Objective-C中,每个新类都使用@interface声明,后跟自定义类名称,后跟冒号并以超类名称结尾。
在此示例中,我们使用NSObject作为我们的超类。
所有类均源自NSObject,因为它是基类。
它是所有Objective-C类的超类。

@interface行和@end行之间的所有内容都描述了该类中包含的内容。

属性用于提供对其他类中的类实例变量的访问。
声明属性始终以@property开头,后跟属性属性。
以下是一些重要属性:

  • Assign:用于随时为属性分配新值
  • nonatomic:线程访问更快。
    但是我们不能同时访问和更改值
  • 只读:我们无法直接为这些属性分配新值
  • 复制:分配给属性的值可以复制并用于其他目的
  • readwrite:我们可以读取和更改属性的值
  • 强:我们直接控制财产的使用寿命
  • 弱:我们可以使属性无效,编译器也可以使该属性无效

类对象的实例变量用花括号定义。
实例变量存储每个对象的各个特征。
实例方法在@end上方定义,并使用以下语法。

- (void)enterInfo;

(void)表示这些方法不会向调用方返回任何内容。
@end表示我们已经完成了对类的定义。
在此示例中,我们为BMI计算器定义一个示例界面。

main.h

#import <Foundation/Foundation.h>

@interface BMI : NSObject

{
  int weight;
}

@property(nonatomic, readwrite) double height;

-(double) bmi;

@end

实例变量是私有的,只能在类实现内部访问。
方法声明以减号(-)或者加号(+)开头。
减号表示此方法是实例方法。
这意味着必须创建并初始化该类的对象才能调用此方法。
类方法(以加号开头)可以简单地通过引用类来使用。
不需要该类的实例。

实施文件

该类的实现可在导航侧列的文件main.m中找到。
我们需要在此类中添加以下预处理器语句以完成BMI类。

#import "main.h"

每次创建类时,都需要像上面的语句一样将接口文件导入到实现文件中。
就像声明一个接口一样,我们需要使用@implementation指令声明实现,在此情况下,其类名称为BMI。

首先,我们在实现内部看到方法定义。
方法签名必须与头文件中的签名完全相同。
类对象通过以下方式初始化和分配:

BMI *person = [[BMI alloc]init];

实例化是一个两步过程:

  • 我们必须通过调用alloc方法为对象分配一些内存
  • 我们需要对其进行初始化,以便可以使用。
    我们永远不要使用未初始化的对象

init是Objective-C的默认初始化方法。
我们可以定义自己的版本来分配变量和参数。
init只是简单的实例方法。

要在Objective-C对象上调用方法,我们需要将实例和方法放在方括号中,并用空格隔开。
参数(如果有)在方法名称之后传递,并以冒号开头。
以下是示例通话摘要。

[person bmi];

@synthesize指令为变量创建一个getter和setter。
以下是使用此指令的代码段。

@synthesize height;

注意:在上述代码段中,我们没有指定实例变量名称。
因此,该名称与属性名称相同。
如果我们希望分配其他名称,请使用以下语法

@synthesize propertyName = instanceVariableName;

实现文件main.m如下:main.m

#import <Foundation/Foundation.h>
#import "main.h"

@implementation BMI

@synthesize height;

-(id)init
{
  self = [super init];
  weight = 68;
  return self;
}

-(double) bmi
{
  return weight/(height*height);
}
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
      
      BMI *person = [[BMI alloc]init];
      
      double result = 0.0;     //Store the bmi result here
      
      
      person.height = 1.7272;
      
      result = [person bmi];
      NSLog(@"BMI of Person is : %f", result);
      
      
  }
  return 0;
}