OC 3月28日学习总结

1.类方法学习引入

用对象方法实现计算器

/*


 OC版计算器

   思路1:

   定义类: Caculator

   属性  : num1  num2   result 

   行为:   add jian cheng  chu 



   思路2:

   定义类:Caculator2
   属性:  
   行为:  add jian cheng chu  (每个方法都需要两个参数,每个方法都有返回值)

 */


#import 
#import "Caculator.h"
#import "Caculator2.h"

void test(){

    //1、创建对象
    Caculator *cal =  [Caculator new];
    cal->_num1 = 30;
    cal->_num2 = 20;
    //2、调用对象方法
    [cal add];

    //3、输出结果
    NSLog(@"result = %.2f",cal->_result);


}
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建对象
        Caculator2  *c2 = [Caculator2 new];

        int result = [c2 cheng:20 andNum2:30];
        float f1 = [c2 chu:10 andNum2:3];

        NSLog(@"result = %d,f1 = %.2f",result,f1);

    }
    return 0;
}
// 计算器类的声明

@interface Caculator2 : NSObject

//加法
-(int )add:(int )num1 andNum2:(int) num2;
//减法
-(int )jian:(int )num1 andNum2:(int) num2;
//乘法
-(int )cheng:(int )num1 andNum2:(int) num2;
//除
-(float )chu:(int )num1 andNum2:(int) num2;

@end

//计算器类的实现
@implementation Caculator2
//加法
-(int )add:(int )num1 andNum2:(int) num2{

    return num1+num2;
}
//减法
-(int )jian:(int )num1 andNum2:(int) num2{


    return num1-num2;
}
//乘法
-(int )cheng:(int )num1 andNum2:(int) num2{

    return num1*num2;
}
//除
-(float )chu:(int )num1 andNum2:(int) num2{


    return num1/(float)num2;
}
@end

2.类方法的概述及定义方法

用类方法实现计算器的功能

// 计算器类的声明
@interface Caculator : NSObject
//类方法的定义格式:
// 跟对象方法相比,把 - 换成 + 就可以了
//加法
+(int )add:(int )num1 andNum2:(int) num2;
//减法
+(int )jian:(int )num1 andNum2:(int) num2;
//乘法
+(int )cheng:(int )num1 andNum2:(int) num2;
//除
+(float )chu:(int )num1 andNum2:(int) num2;
@end

// 计算器类的实现

3.类方法注意事项

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //类方法的使用注意:

        //1、类方法和对象方法可以同名,调用的时候,互不影响
        //先调用类方法  ,必须使用类名来调用
        [Person run];   //run 的类方法

        //调用对象方法   必须使用对象来调用
        Person *p = [Person new];
        [p run];       //用对象来调用的,调用对象的run方法


        //2、OC中的消息机制
        [p run];       //向对象p发送一条run消息


        //发送一个test消息
        [Person test];

//        [p test];
    }
// Person类的声明

@interface Person : NSObject


// 声明类方法或者对象方法
-(void) run;
+(void) run;
+(void)test;
@end

// Person类的实现

@implementation Person
-(void) run{

    NSLog(@"对象方法:run");

}
+(void) run{

     NSLog(@"类方法:run");

}

+(void)test{


}
@end

4.类方法易犯的错误

/*

   类方法容易犯的错误

    1)在类方法中使用了实例变量

     因为变量根本没有被分配内存空间,所以不能访问


    2)类方法和对象方法的区别


         类方法                 对象方法
 调用:    类名                   对象名
 声明:    +开头                  -开头
 实例变量: 不能访问               能访问

 方法调用:

       1、在类方法中,能否调用对象方法? 可以

          1)在类方法中创建一个新的对象


             +(void)test{

             Person *p = [Person new];
             p->_speed = 280;
             [p run];

             }

          2)对象作为类方法的参数传递过来

             +(void)test:(Person *)person{

             //对象作为方法的参数,传递过来
             [person run];

             }

           3)在类方法中,可以调用其他对象的方法



       2、在对象方法中,能否调用类方法? 可以类方法

        1)调用当前类的类方法
         -(void) run{

         NSLog(@"人在以%d码的速度疯跑",_speed);

         //能不能调用类方法呢?
         [Person run];

         }

        2)还可以调用其他类的类方法



       3、在类方法中不能调用自己


 */

#import 
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建对象
//        Person *p = [Person new];
//        p->_speed = 180;

//        [p run];


        //调用类方法
//        [Person test];
//        [Person test:p];

        [Dog bark];


    }
    return 0;

5.类方法的应用场景

类方法适合用在不要求访问成员变量的方法中

// 定义IPhone类
typedef enum {kColorBlack,kColorWhite,kColorTHJ} IColor;
@interface IPhone : NSObject{

    IColor _color;
}

//定义一个类方法,当我们给一个颜色的枚举值的时候,返回字符串
+(NSString *)getPhoneColor:(IColor) color;
@end

// 实现IPhone类

@implementation IPhone

+(NSString *)getPhoneColor:(IColor) color{

    NSString *colorName;

    switch (color) {

        case kColorBlack:
            colorName = @"黑色";
            break;

        case kColorWhite:
            colorName = @"白色";
            break;

        case kColorTHJ:
            colorName = @"土豪金";
            break;


        default:
            break;
    }

    return colorName;

}

6.匿名类的概念及使用

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建对象
//        Car *car1 = [Car new];
//        car1->_lzNum = 4 ;
//        car1->_speed = 180;
//        //调用对象方法
//        
//        [car1 run];
//        [car1 stop];

        //[Car new] 匿名类
        //关于匿名类访问成员变量:
        //1)能够访问自己的实例变量
        //2)只能正确地访问一次
//        [Car new]->_lzNum = 80;
//        
//        NSLog(@"_lzNum = %d",[Car new]->_lzNum);

        //匿名类调用方法
        //Car *car1 = [Car new];
        //使用匿名类可以调用方法
        //调用方法的时候,可以简化代码
//        [[Car new] run];

        //创建对象的另一种写法
//        [Car alloc];  //申请内存空间    malloc
//          [init]      //初始化方法

        Car *c1 = [Car new];
        Car *c2 = [[Car alloc] init];

        //new  ====  alloc  init
        //[Car new];
        //使用[[Car alloc] init]作用和使用new是等价的
        //但是,使用new的时候,每次实例变量默认的值都是0
        //而使用alloc init 的方式,我们可以在初始化的时候,指定实例变量的初始值


//        c2->_lzNum = 20;
//        c2->_speed = 100;
        [c2 run];
        [c2 stop];
    }
    return 0;
}

7.匿名类作为方法的参数

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建一个车
//        Car *c1 = [Car new];
//        
//        Person *p = [Person new];
//        [p goHomeByCar:c1];

        //3、匿名类作为方法的参数
        [[Person new] goHomeByCar:[Car new]];

    }
    return 0;
}

10.封装的实现步骤

封装就是把类的成员属性保护起来,不能随便修改和调用,在设置的时候也可以加入过滤

typedef enum {kSexMan,kSexWomen,kSexYao} Sex;
@interface Person : NSObject
{
    //给person声明一个实例变量

    int _age;

    NSString *_name;

    Sex _sex;

}

//封装的目的:给实例实例变量 _age _name _sex 对外提供一个接口
//接口(对象方法):1)设置 实例变量的值     2)获取实例变量的值

//setter方法的书写规范
/*
   set方法的声明的规范:

   1)该方法没有返回值    void
   2) 一定是一个对象方法   以-开头
   3)方法名一定要以set开头,然后跟上 去掉下划线的实例变量名,并且实例变量名首字母要大写
   4)set方法一定有一个参数,而且参数类型一定要和实例变量的类型要保持一致
   5)set方法的形参名一般是 去掉下划线的实例变量名

   set方法的实现:
   1)在set方法的内部,必须要给实例变量赋值形参的值





   2、获取实例变量的值

   getter方法:作用,对外部提供了一个 可以获取对象实例变量值的一个接口

   getter方法声明书写规范:

    1)get方法一定有返回值    并且返回值类型和 实例变量的类型要保持一致
    2)get方法也一定是一个对象方法    以-开头
    3)get方法的名称   去掉下划线的实例变量名

   getter方法的实现规范:

    1)在方法的内部,一定要返回实例变量的值

 */
//声明 _age 这个实例变量的set方法
-(void)setAge:(int) age;
// _age 的get方法
-(int)age;

//声明:  NSString *_name; set方法
-(void)setName:(NSString *) name;
-(NSString *)name;

//声明    Sex _sex 的set方法
-(void)setSex:(Sex) sex;
-(Sex)sex;

@end

// Person 类的实现
@implementation Person
//实现 _age 这个实例变量的set方法
-(void)setAge:(int) age{

    if (age<0) {

        _age = 10;

    }else{
         _age = age;
    }

}

-(int)age{

    return _age;

}



//实现:  NSString *_name; set方法
-(void)setName:(NSString *) name{

    _name = name;

}
-(NSString *)name{

    return _name;

}

//实现    Sex _sex 的set方法
-(void)setSex:(Sex) sex{

    _sex = sex;
}
-(Sex)sex{

    return _sex;
}
@end

11.封装应用:股票k线计算


@interface KLine : NSObject
{
    //最低价格(set、get)
    float _minPrice;
    //最高价格(set,get)
    float _maxPrice;
    //平均价格(get)
    float _avgPrice;
}

//读写方法
// _minPrice 的set和get方法
-(void)setMinPrice:(float) minPrice;
-(float)minPrice;

-(void)setMaxPrice:(float) maxPrice;
-(float)maxPrice;

-(float)avgPrice;
@end

// 股票类的实现

@implementation KLine

-(void)setMinPrice:(float) minPrice{

    _minPrice  = minPrice;

    //计算平均值
    _avgPrice = (_maxPrice + _minPrice)/2;

}
-(float)minPrice{

    return _minPrice;

}

-(void)setMaxPrice:(float) maxPrice{

    _maxPrice = maxPrice;
    //计算平均值
    _avgPrice = (_maxPrice + _minPrice)/2;
}
-(float)maxPrice{

    return _maxPrice;
}

-(float)avgPrice{

    return _avgPrice;

}
@end

12.依赖关系

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        IPhone *iphone7plus = [IPhone new];

        Gril *gril = [Gril new];
        //A对象作为B对象的方法的形参或者是局部变量,此时我B依赖A
        //girl -依赖-> iphone7plus
        [gril call:iphone7plus];



    }
    return 0;
}

13.关联关系

常见的关联关系有:1对1,1对多,多对多

你可能感兴趣的:(OC)