OC类的声明和实现语法

 1.接口的声明

@interface NewClassName: ParentClassName
{
    实例变量
    ...
}

    方法的声明
    ...
@end
//...表示省略了一些代码的意思。

 

2.类的实现

@implementation NewClassName
{
    方法的实现
    //code 
   ...
}

@end
//...表示省略了一些代码的意思。

 

二 自定义类

  任何一个类都可以通过以下两种途径描述对象:

  • 类的方法(包括实例方法和类方法)。
  • 类实例所包含的实例变量。

下面的例子创建一个名为 Person 的类,需要使用两个文件类定义 Person类: Person.h 和 Person.m .

  • Person.h 称为头文件(header file)或接口文件(interface file),包含实例变量和方法的声明。
  • Person.m 称为实现文件(inplmentation file),包含所有方法代码的实。

 创建一个新的项目,类型为基于 OS的Application的Command Line Tool,名称为 FirstClass。

IOS基础之 (三) 类的声明和对象的创建_iOS开发 

  创建新类的步骤是,选择 File -> New -> File..... 在新出现的窗口左侧,选择 OS X区域中的 Source, 然后选择Cocoa模板。将类命名为

Person,并将其设置为 NSObject的子类,最后确认勾选了 FirstClass目标,单击 Save。

IOS基础之 (三) 类的声明和对象的创建_iOS教程_02

 

IOS基础之 (三) 类的声明和对象的创建_iOS开发_03

   新创建的类文件(Person.h和Person.m)会在项目导航面板上出现。

IOS基础之 (三) 类的声明和对象的创建_iOS教程_04

   打开Person.h 声明2个实例变量和3个实例方法,代码如下:

#import <Foundation/Foundation.h>

//Person类继承了NSObject类所定义的全部实例变量和方法
@interface Person : NSObject
{
    //Person拥有2个实例变量
    int age;
    NSString *name;
}

//确认以下方法,可以为Person的实例变量赋值
- (void)setAge:(int)_age;
- (void)setName:(NSString *)_name;
- (void)sayHello; @end

  实例变量的声明卸载花括号的里面。方法的声明要写在变量声明之后,且花括号的外面。

     这段代码告诉编译器,程序定义了一个名为 Person的新类,拥有NSObject类的全部方法和实例变量。另外还增加了两个新的实例变量,名为age的int变量和名为name的NSString变量。最后还增加了3个实例方法,

这些方法会在Person.m中实现。

    打开Person.m,删除全部已有的方法代码,然后为之前声明的方法加入实现代码。

#import "Person.h"

@implementation Person

- (void)setName:(NSString *)_name
{
    name = _name;
}

- (void)setAge:(int)_age
{
    age = _age;
}

- (void)sayHello
{
    NSLog(@"hello %@, I am %d years old.", name, age);
}

@end

   需要注意的时,有Xcode创建的Person.m已经自动导入了Person.h。此外,在Person.m中实现的方法,其方法名必须和在Person.h中声明的相应方法名完全匹配。在Xcode的帮助下,很容易做到这一点,

Xcode 会根据已经声明的方法,自动提供候选方法名。

     以上代码实现了Person.h中声明的全部方法,至此Person类创建完毕,修改 main.m,使用新创建的Person类,代码如下:

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建Person实例
        Person *person = [[Person alloc] init];
        
         //为实例赋值
        [person setAge:35];
        [person setName:@"xpws"];
        
        //调用 sayHello方法
        [person sayHello ];
        
    }
    return 0;
}

  构建并运行程序。注意:以上代码导入了Person.h,目的是让编译器知道那些在main()使用的Person类方法是怎样声明的。

 三 类的定义语法

类的接口定义方法如下:

@interface 类的名字 : 父类的名字 {
    实体变量类型 实体变量名字;
    
}
- (返回值类型)方法名字;
+ (返回值类型)方法名字;
- (返回值类型)方法名字:(变量类型) 变量名字 标签1:(变量类型) 变量1名字; ...
@end
//...表示省略了一些代码的意思。

 

类的定义部分如下,这部分内容的关键点为@implementation和@end。

@implementation 类的名字
-(方法返回值) 方法名字
{
    方法定义
    ...
}
-(方法返回值) 方法名字:(变量类型) 变量名字
{
    方法定义
    ...
}

@end

//...表示省略了一些代码的意思。

 

四 类的实例化

   Objective-C使用消息(Message)来调用方法,所谓的消息就是一个类或者对象可以执行的动作。消息的格式如下:

[对象或者类名字 方法名字:参数序列];

 

  首先我们观察到有两个中括弧, 最右边的括弧之后是一个分号,当编译器遇到了这个格式之后会把中间的部分当作一个消息来发送。在上文的表达式当中,包括中括弧的所有部分的内容被称作消息表达式(Message expression),“对象或者类名字”被称作接收器(Receiver),也就是消息的接受者,“方法名字:参数序列”被称为一个消息(Message),“方法名字”被称作选择器(Selector)或者关键字(Keyword)。Objective-C和C语言是完全兼容的,C语言里面的中括弧用于表示数组,但是数组的格式明显和消息的发送的格式是不一样的,所以我们可以放心,编译器不会把我们的消息发送当作一个数组。

 

二 OC工程里引入C语言

1. 新建一个C语言的头文件和实现文件

Hi.h

1 #ifndef Hi_h
2 #define Hi_h
3 
4 #include <stdio.h>
5 
6 void sayHi();
7 
8 #endif 

 

Hi.c

#include <stdio.h>
#include "Hi.h"

void sayHi(){
    printf(".. say ...\n");
    
}

 2. 在 main.m中引入hi.h 头文件

1 #import <Foundation/Foundation.h>
2 #import "Hi.h"
3 
4 int main(int argc, const char * argv[]) {
5     
6 sayHi();
7     
8     return 0;
9 }

在第2行导入c的头文件,可以改为 #include "Hi.h"