OC方法以及文件编译

OC方法

OC方法包括对象方法和类方法。

对象方法与函数

 1.对象方法都是以减号

 2.对象方法的声明必须写在@interface@end之间

  对象方法的实现必须写在@implementation@end之间

 3.对象方法只能由对象来调用

 4.对象方法归类\对象所有

 

 函数

 1.函数能写在文件中的任意位置(@interface@end之间除外),函数归文件所有

 2.函数调用不依赖于对象

 3.函数内部不能直接通过成员变量名访问某个对象的成员变量

//
//  main.m
//  hello
//
//  Created by 程雷 on 15/3/11.
//  Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
//定义美剧类型,学生的性别
typedef enum {
    SexMan,
    SexWoman
} Sex;
//定义结构体,学生的生日
typedef struct {
    int year;
    int month;
    int day;
} Date;
//美剧类型,喜爱颜色
typedef enum {
    ColorBlack,
    ColorRed,
    ColorGreen
} Color;
//dog类的声明
@interface Dog : NSObject
{
@public
    double weight; // 体重
    Color curColor; // 毛色
}

- (void)eat;
- (void)run;
@end
//dog类的实现
@implementation Dog
- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"狗吃完这次后的体重是%f", weight);
}

- (void)run
{
    weight -= 1;
    NSLog(@"狗跑完这次后的体重是%f", weight);
}
@end

/*
 学生
 成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色,吃、跑)
 方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃)
 */
//学生类得声明
@interface Student : NSObject
{
@public
    Sex sex; // 性别
    Date birthday; // 生日
    double weight; // 体重(kg)
    Color favColor; // 最喜欢的颜色
    char *name;
    
    // 重点:狗
    Dog *dog;
}
- (void)eat;
- (void)run;
- (void)print;

- (void)liuDog;
- (void)weiDog;
@end
//学生类的实现
@implementation Student

- (void)liuDog
{
    // 让狗跑起来(调用狗的run方法)
    [dog run];
}

- (void)weiDog
{
    // 让狗吃东西(调用狗的eat方法)
    [dog eat];
}

- (void)print
{
    NSLog(@"性别=%d, 喜欢的颜色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);
}

- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"学生吃完这次后的体重是%f", weight);
}

- (void)run
{
    weight -= 1;
    NSLog(@"学生跑完这次后的体重是%f", weight);
}
@end
void test();  //声明一个测试函数
//主函数
int main()
{
        test();
    NSLog(@"这上边是test函数输出的");
    Student *s = [Student new];
    
    Dog *d = [Dog new];
    d->curColor = ColorGreen;
    d->weight = 20;
    s->dog = d;
    
    [s liuDog];
    
    [s weiDog];
    return 0;
}


void test()
{
    Student *s = [Student new];
    s->weight = 50;
    
    // 性别
    s->sex = SexMan;
    
    // 生日
    Date d = {2011, 9, 10};
    s->birthday = d;
    
    s->name = "Jack";
    
    
     s->birthday.year = 2011;
     s->birthday.month = 9;
     s->birthday.day = 10;
    
    
    // 喜欢的颜色
    s->favColor = ColorBlack;
    
     [s eat];
     [s eat];
     
     [s run];
     [s run];
    
    
    [s print];
}

类方法

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

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

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

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

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

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

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

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

//计算器类的声明
#import<Foundation/Foundation.h>
//实现一个计算机类,实现三个整数的和
@interface JiSuanQi : NSObject
//工具类一般没有成员变量
+(int)SumOfNumber:(int)number1 AndNumber2:(int)number2 AndNumber3:(int)number3 ;

@end


//计算器类的实现
#import  "JiSuanQi.h"
@implementation JiSuanQi
+(int)SumOfNumber:(int)number1 AndNumber2:(int)number2 AndNumber3:(int)number3 {
    return number1+number2+number3;
}
@end


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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //直接使用类名调用类方法
        int a=[JiSuanQi SumOfNumber:10 AndNumber2:20 AndNumber3:30];
        NSLog(@"和是%d",a);
        int b=[JiSuanQi SumOfNumber:100 AndNumber2:200 AndNumber3:300];
        NSLog(@"和是%d",b);
    }
    return 0;
}

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值