• OC方法和文件编译


    一、OC方法

    (一)对象方法

    (1)对象方法以-开头,如 - (void)xx;

    (2)对象方法只能用对象来调用

    (3)对象方法中可以访问当前对象的成员变量

    (4)调用格式   [对象名  对象方法名];

    (5)设计一个学生类和狗类,练习对象方法的使用。

    学生类的声明:

     1 // 设计一个学生类,学生的属性包括:性别、生日、体重、最喜欢的颜色、狗(体重、 毛色、吃)
     2 // 方法:吃、跑步、遛狗、喂狗
     3 #import <Foundation/Foundation.h>
     4 @class Dog;
     5 
     6 /**
     7  定义枚举类型,学生性别
     8  */
     9 typedef enum {
    10     sexMale, // 男性
    11     SexFemale // 女性
    12 }Sex;
    13 
    14 /**
    15  *  定义结构体:生日
    16  */
    17 typedef struct {
    18     int year;
    19     int month;
    20     int day;
    21 }Date;
    22 
    23 typedef enum {
    24     ColorBlack,
    25     ColorRed,
    26     ColorGreen
    27 }Color;
    28 
    29 
    30 @interface Student : NSObject
    31 {
    32     @public
    33     NSString *name; // 姓名
    34     Sex sex; // 性别
    35     Date birthday; // 生日
    36     double weight; // 体重
    37     Color favColor; // 喜欢的颜色
    38     Dog *dog;
    39 }
    40 
    41 - (void)eat;
    42 - (void)run;
    43 - (void)print;
    44 - (void)weiDog;
    45 - (void)liuDog;

    学生类的实现:

     1 #import "Student.h"
     2 #import "Dog.h"
     3 
     4 @implementation Student
     5 
     6 - (void)eat
     7 {
     8     weight += 1;
     9     NSLog(@"人吃完这次后的体重是%d", weight);
    10 }
    11 
    12 - (void)run
    13 {
    14     weight -= 1;
    15     NSLog(@"人跑完这次后的体重是%d", weight);
    16 }
    17 
    18 - (void)print
    19 {
    20     NSLog(@"姓名 = %@, 性别 = %d, 喜欢的颜色 = %d, 生日 = %d-%d-%d", name, sex, favColor, birthday.year, birthday.month, birthday.day);
    21 }
    22 
    23 - (void)weiDog
    24 {
    25     // 在学生类对象的对象方法中调用狗对象的对象方法
    26     [dog eat];
    27 }
    28 
    29 - (void)liuDog
    30 {
    31     [dog run];
    32 }
    33 
    34 @end

    狗类的声明:

    #import <Foundation/Foundation.h>
    
    @interface Dog : NSObject
    {
        @public
        double weight;
    }
    
    - (void)eat;
    - (void)run;
    @end

    狗类的实现:

     1 #import "Dog.h"
     2 
     3 @implementation Dog
     4 
     5 - (void)eat
     6 {
     7     weight += 1;
     8     NSLog(@"狗吃完这次后的体重是%f", weight);
     9 }
    10 
    11 - (void)run
    12 {
    13     weight -= 1;
    14     NSLog(@"狗跑完这次后的体重是%f", weight);
    15 }
    16 
    17 @end

    主程序:

    #import <Foundation/Foundation.h>
    #import "Student.h"
    #import "Dog.h"
    
    int main(int argc, char * argv[]) {
        
        // 创建一个学生类对象
        Student *stu = [[Student alloc] init];
        // 对学生类对象的一些属性进行初始化
        stu -> name = @"Zeng";
        stu -> sex = sexMale;
        stu -> favColor = ColorBlack;
        Date date = {1989, 7, 22};
        stu -> birthday = date;
        stu -> weight = 110;
        
        // 创建一个狗对象
        Dog *dog = [[Dog alloc] init];
        dog -> weight = 8;
        
        stu -> dog = dog;
        // 调用学生类的对象方法
        [stu print];
        [stu run];
        [stu eat];
        
        // 调用狗对象类的对象方法
        [dog eat];
        [dog run];
        
        [stu weiDog];
        [stu liuDog];
        
        return 0;
    }

     

    (二)类方法

    (1)类方法以+开头  如+(void)put;

    (2)类方法只能由类来调用

    (3)类方法中不能访问实例(成员)变量,因为类方法又类来调用,并没有创建存储空间来存储类中的成员变量。

    (4)调用格式:[类名  类方法名];

    (5)类方法的好处和适用场合:

    不依赖于对象,执行效率更高;

    能用类方法解决的问题,尽量使用类方法;

    场合:当方法内部不需要使用到成员变量时,可以改为类方法。

    (6)设计一个计算器类,练习使用类方法。

    计算器类的声明:

    1 // 实现一个简单的计算器工具类,实现一个类方法,计算三个整数的和。
    2 #import <Foundation/Foundation.h>
    3 
    4 @interface JiSuanQi : NSObject
    5 
    6 // 工具类一般没有成员变量
    7 + (int)sumOfNumber1:(int)num1 andNumber2:(int)num2 andNumber3:(int)num3;
    8 
    9 @end

     

    计算器类的实现:

     

     1 // 计算器类方法的实现
     2 #import "JiSuanQi.h"
     3 
     4 @implementation JiSuanQi
     5 
     6 + (int)sumOfNumber1:(int)num1 andNumber2:(int)num2 andNumber3:(int)num3
     7 {
     8     return num1 + num2 + num3;
     9 }
    10 
    11 @end

    主程序:直接使用类名调用类方法

     

     1 #import <Foundation/Foundation.h>
     2 #import "JiSuanQi.h"
     3 
     4 int main(int argc, char * argv[]) {
     5     
     6     int a = [JiSuanQi sumOfNumber1:10 andNumber2:20 andNumber3:30];
     7     NSLog(@"a和为%d", a);
     8     
     9     int b = [JiSuanQi sumOfNumber1:100 andNumber2:200 andNumber3:300];
    10     NSLog(@"b和为%d", b);
    11     
    12     return 0;
    13 }

    注意1:可以允许类方法和对象方法同名。

    注意2:在对象方法中可以调用类方法。

     

    (三)方法名

    (1)不带参数的方法

    声明:

     

    调用:

     

    (2)带参数的方法

    声明:

    调用:

     

     

     注意:冒号也是方法名的一部分。

    二、文件编译

    在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h头文件中,实现写在相应的.m文件中去,类名是什么,文件名的前缀就是什么。

    假设有两个类,分别是Person类和Dog类,则通常有下面五个文件:

    (1)Person.h    Person类的声明文件

    (2)Person.m    Person类的实现文件

    (3)Dog.h Dog类的声明文件

    (4)Dog.m Dog类的实现文件

    (5)Main.m 主函数(程序入口)

    在主函数以及类的实现文件中要使用#import包含相应的头文件。

    补充:import有两个作用:一是和include一样,完完全全的拷贝文件的内容;二是可以自动防止文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)。

    在使用命令行进行编译链接文件的时候,通常是把.m文件单文件编译,然后再把所有的目标文件链接,但是在Xcode中,是把所有的.m文件都进行编译链接的,如果出现重复定义的错误,那大部分问题根源应该就是文件内容被重复包含或者是包含.m文件所引起的。

    源文件中不论是使用include还是import,都不能包含.m或者是.c文件,只能放声明。因此,在OC中通常把类拆分开来,拆分成声明和实现两个部分。

    提示:这也是编程思想的一种体现,可以说.h和.m文件时完全独立的,只是为了要求有较好的可读性,才要求两个文件的文件名一致,这也是把接口和实现分离,让调用者不必去关心具体的实现细节。

    Xcode是写一行编译一行,有简单的修复功能,红色是错误提示,黄色警告。如果在程序中声明了一个变量,但是这个变量没有被使用也会产生警告信息。在调试程序的时候,如果发现整个页面都没有报错,但是一运行就错误,那么一定是链接报错。

  • 相关阅读:
    html5 语义
    HTML Web Workers
    创建删除元素appendChild,removeChild,createElement,insertBefore
    getPos封装
    getPos,offsetTop
    HTML 中有用的字符实体
    ellipsis
    HTML 统一资源定位器
    width,clientWidth,offsetWidth
    .offsetLeft,.offsetTop
  • 原文地址:https://www.cnblogs.com/zengshuilin/p/5732346.html
Copyright © 2020-2023  润新知