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


    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。

     

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

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

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

       打开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 ...
    ");
        
    }

     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"

  • 相关阅读:
    hdu 4135 Co-prime (容斥定理)
    hdu 1509 Windows Message Queue (优先队列)
    poj 2104 K-th Number (划分树)
    hdu 1556 Color the ball (树状数组)
    海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践
    使用MaxCompute Java SDK运行安全相关命令
    使用MaxCompute Java SDK 执行任务卡住了,怎么办?
    老代码多=过度耦合=if else?阿里巴巴工程师这样捋直老代码
    日志服务Python消费组实战(三):实时跨域监测多日志库数据
    如何限制用户仅通过HTTPS方式访问OSS?
  • 原文地址:https://www.cnblogs.com/wangshuo1/p/ios-3.html
Copyright © 2020-2023  润新知