OC3月26日学习总结

1.对象的存储细节

/*
 [Person new]; 3件事
 1)分配内存空间
 2)初始化类中的实例变量
 3)返回内存地址

 问题1: [Person new]后,创建对象,对象保存在内存中的哪个区?
 new的时候,为对象在堆区分配内存空间,(分配的空间是动态分配)

 问题2:实例变量在内存哪个区?指针p在内存哪个区?
 实例变量保存堆区, 指针p保存在栈区


 问题3:[p run]是怎么调用的?
 指针p->堆中的对象->对象中的isa指针->代码区中的类->类中的run方法

 4.使用一个类可以实例化多个对象

 */

#import 
//类的声明
@interface Person : NSObject
{
    //定义实例变量
    @public
    NSString *_name; //姓名
    int _age; //年龄
}
//方法的声明
//走方法的声明
- (void)run;

@end

@implementation Person

//方法的实现
- (void)run{
    NSLog(@"%@ 像狗一样疯跑", _name);
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建对象
        Person *p = [Person new];

        //给实例变量赋值
        p->_name = @"柯南";
        p->_age = 12;

        //调用方法
        [p run];

        NSLog(@"姓名:%@, 年龄:%d", p->_name, p->_age);
        NSLog(@"内存地址:%p",p);

        //创建一个新对象
        Person *p2 = [Person new];

        //给实例变量赋值
        p2->_name = @"步美";
        p2->_age = 11;

        NSLog(@"姓名:%@, 年龄:%d", p2->_name, p2->_age);
        NSLog(@"内存地址:%p",p2);


    }

2.paragma mark指令的使用

#import 

#pragma mark 狗类的声明
//狗类的声明
@interface Dog : NSObject
{
    //定义实例变量
    int _age;
    NSString *_name;
}

//方法的声明
- (void)eat;

@end

#pragma mark 狗类的实现
@implementation Dog

//方法的实现
- (void)eat{
    NSLog(@"狗在吃东西");
}

@end


#pragma mark - 人类的声明
//类的声明
@interface Person : NSObject
{
    //定义实例变量
@public
    NSString *_name; //姓名
    int _age; //年龄
}
//方法的声明
//走方法的声明
- (void)run;

@end

#pragma mark 人类的实现
@implementation Person

//方法的实现
- (void)run{
    NSLog(@"%@ 像狗一样疯跑", _name);
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }

3.函数和对象方法的区别

#import 

//类的声明
@interface Person : NSObject
{
    //定义实例变量
@public
    NSString *_name; //姓名
    int _age; //年龄
}
//方法的声明
//走方法的声明
- (void)run;

//类方法的声明
+ (void)test;


@end


@implementation Person

//方法的实现
- (void)run{
    NSLog(@"%@ 像狗一样疯跑", _name);
}

//类方法的声明
+ (void)test{
    NSLog(@"调用类方法");
}
@end

//void test();
//void test(){
//    NSLog(@"调用函数 ,%@", _name);
//}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建对象
        Person *p = [Person new];

        //给对象实例变量赋值
        p->_age = 20;
        p->_name = @"路飞";

        //调用方法
        [p run];
//        [p test];
        //调用类方法
        [Person test];
//        [Person run];
        test();

    }
    return 0;

4.常见错误汇总

#import 

#pragma mark 狗类的声明
//狗类的声明
@interface Dog : NSObject
{
    //定义实例变量
    int _age;
    NSString *_name;
}

//方法的声明
- (void)eat;

@end

#pragma mark - 人类的声明
//类的声明
@interface Person : NSObject
{
    //定义实例变量
@public
    NSString *_name; //姓名
     int _age; //年龄

}
//方法的声明
//走方法的声明
- (void)run;

@end

#pragma mark 狗类的实现
@implementation Dog

//方法的实现
- (void)eat{
    NSLog(@"狗在吃东西");
}

@end



int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建对象
        Person *p = [Person new];

        //给对象实例变量赋值
        p->_name = @"凤姐";
        p->_age = 30;
        //调用方法


        NSLog(@"aaa");
        @try {
            //将要出错的代码
             [p run];
        }
        @catch (NSException *exception) {
            //出错以后,要处理的代码
            NSLog(@"出错了, run方法没有实现");
            NSLog(@"==%@", exception);
        }
        @finally {
            //不管出没出错,都会运行的代码
            NSLog(@"巴巴爸爸");
        }

        NSLog(@"出现吧神龙");


//        run();


    }
    return 0;
}

#pragma mark 人类的实现
@implementation Person

//方法的实现
//- (void)run{
//    NSLog(@"%@ 像狗一样疯跑", _name);
//}

@end

5.对象和方法之间的关系

/*
 C语言
 int sum(int x, int y);
 int sum(int x, int y){

 }
 OC中有参有返回值的方法
 - (int)sum:(int)x andY:(int)y;
 - (int)sum:(int)x andY:(int)y{
 }

 1.对象作为方法的参数 
 //显示人信息的方法,
 - (void)showPerson:(Person *)person;

 2.对象作为方法的返回值
 //变性方法
 - (Person *)changePerson:(Person *)person;


 */

#import 
//定义性别枚举
typedef enum{
    kSexWomen, kSexMan, kSexYao
}Sex;

//类的声明
@interface Person : NSObject
{
    //定义实例变量
@public
    NSString *_name; //姓名
    int _age; //年龄
    Sex _sex; //性别

}
//方法的声明
//走方法的声明
- (void)run;
//显示人信息的方法
- (void)showPerson:(Person *)person;

//变性方法的声明
- (Person *)changePerson:(Person *)person;

@end

@implementation Person

//方法的实现
- (void)run{
    NSLog(@"%@ 像狗一样疯跑", _name);
}

//显示人信息的方法的实现
- (void)showPerson:(Person *)person{
    NSLog(@"传进来人对象的姓名:%@, 年龄:%d, 性别:%d", person->_name, person->_age, person->_sex);

}

//变性方法的声明
- (Person *)changePerson:(Person *)person{

    person->_sex = kSexYao;
    return person;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
      //创建对象
        Person *p = [Person new];

        //创建对象p1
        Person *p1 = [Person new];

        //给对象p1的实例变量赋值
        p1->_name = @"凤姐";
        p1->_age = 30;

        //调用显示人信息方法
        [p showPerson:p1];

        //创建对象p2
        Person *p2 = [Person new];

        //给对象p2的实例变量赋值
        p2->_name = @"春哥";
        p2->_age = 28;
        p2->_sex = kSexWomen;
        //调用方法
        [p showPerson:p2];

        [p changePerson:p2];

        [p showPerson:p2];


    }
    return 0;
}

6.练习题1

/*
 1> 属性
 * 颜色
 * 速度(单位是m/s)
 * 性别
 * 体重(单位是kg)

 2> 行为
 * 吃:每吃一次,体重增加0.5kg,输出吃完后的体重
 * 吠(叫):输出所有的属性
 * 跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重
 * 比较颜色:跟别的狗比较颜色,如果一样,返回YES(1),不一样,返回NO(零值)
 * 比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)

 */

#import 
//定义颜色枚举
typedef enum{
    kColorBlack, kColorYellow, kColorHua,kColorWhite
}Color;

//定义性别枚举
typedef enum{
    kSexFemale, kSexMale, kSexYao
}Sex;

//类的声明
@interface Dog : NSObject
{
    @public
//    * 颜色
    Color _color;
//    * 速度(单位是m/s)
    int _speed;
//    * 性别
    Sex _sex;
//    * 体重(单位是kg)
    float _weight;
}
//方法的声明
//吃方法
- (void)eat:(NSString *)foodName;
//叫方法
- (void)bark;
//跑的方法
- (void)run;
//比较颜色
- (BOOL)compareColorWithDog:(Dog *)dog;

//比较速度
- (int)compareSpeedWithDog:(Dog *)dog;

@end

@implementation Dog
//方法的具体实现
//吃方法实现
//吃:每吃一次,体重增加0.5kg,输出吃完后的体重
- (void)eat:(NSString *)foodName{
    _weight += 0.5;
    NSLog(@"哮天犬 %@ ,当前体重:%.2f", foodName, _weight);

}

//叫方法
- (void)bark{
    NSLog(@"颜色:%d, 速度:%d, 性别:%d, 体重:%.2f", _color, _speed, _sex, _weight);
}

//跑的方法
//跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重
- (void)run{
    _weight -= 0.5;
    NSLog(@"哮天犬正在以%d速度跑, 跑完后的体重%.2f", _speed ,_weight);

}

//比较颜色
//比较颜色:跟别的狗比较颜色,如果一样,返回YES(1),不一样,返回NO(零值)
- (BOOL)compareColorWithDog:(Dog *)dog{
    if (_color == dog->_color) {
        return YES;
    }else{
        return NO;
    }
}

//比较速度
//比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)
- (int)compareSpeedWithDog:(Dog *)dog{
    return _speed - (dog->_speed);
}

@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建对象d
        Dog *d = [Dog new];
        //给对象实例变量赋值
        d->_color = kColorBlack;
        d->_sex = kSexYao;
        d->_speed = 80;
        d->_weight = 66.6f;

        //调用吃方法
        [d eat:@"带粑粑的榴莲"];
        [d eat:@"带粑粑的红薯"];
        //调用狗叫得方法
        [d bark];
        //调用跑得方法
        [d run];

        //创建对象d2
        Dog *d2 = [Dog new];
        //给对象实例变量赋值
        d2->_color = kColorHua;
        d2->_sex = kSexFemale;
        d2->_speed = 77;
        d2->_weight = 55.5f;

        //调用比较颜色方法
        BOOL comColor = [d compareColorWithDog:d2];
        NSLog(@"比较颜色:%d", comColor);

        //调用比价速度方法
        int comSpeed = [d compareSpeedWithDog:d2];
        NSLog(@"比较速度:%d", comSpeed);

    }
    return 0;
}

7.练习题2

/*
 2.结合前面的“狗”类,设计一个“人”类
 1> 属性
 * 姓名
 * 狗(人养了一条狗)
 2> 行为
 *  喂狗:每喂一次,狗就会执行“吃”这个行为
    遛狗:每溜一次,狗就会执行“跑”这个行为

 */

#import 

#pragma mark - Dog类的声明
//定义颜色枚举
typedef enum{
    kColorBlack, kColorYellow, kColorHua,kColorWhite
}Color;

//定义性别枚举
typedef enum{
    kSexFemale, kSexMale, kSexYao
}Sex;

//类的声明
@interface Dog : NSObject
{
@public
    //    * 颜色
    Color _color;
    //    * 速度(单位是m/s)
    int _speed;
    //    * 性别
    Sex _sex;
    //    * 体重(单位是kg)
    float _weight;
}
//方法的声明
//吃方法
- (void)eat:(NSString *)foodName;
//叫方法
- (void)bark;
//跑的方法
- (void)run;
//比较颜色
- (BOOL)compareColorWithDog:(Dog *)dog;

//比较速度
- (int)compareSpeedWithDog:(Dog *)dog;

@end

#pragma mark - Dog类的实现
@implementation Dog
//方法的具体实现
//吃方法实现
//吃:每吃一次,体重增加0.5kg,输出吃完后的体重
- (void)eat:(NSString *)foodName{
    _weight += 0.5;
    NSLog(@"哮天犬 吃%@ ,当前体重:%.2f", foodName, _weight);

}

//叫方法
- (void)bark{
    NSLog(@"颜色:%d, 速度:%d, 性别:%d, 体重:%.2f", _color, _speed, _sex, _weight);
}

//跑的方法
//跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重
- (void)run{
    _weight -= 0.5;
    NSLog(@"哮天犬正在以%d速度跑, 跑完后的体重%.2f", _speed ,_weight);

}

//比较颜色
//比较颜色:跟别的狗比较颜色,如果一样,返回YES(1),不一样,返回NO(零值)
- (BOOL)compareColorWithDog:(Dog *)dog{
    if (_color == dog->_color) {
        return YES;
    }else{
        return NO;
    }
}

//比较速度
//比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)
- (int)compareSpeedWithDog:(Dog *)dog{
    return _speed - (dog->_speed);
}

@end

#pragma mark - Person类的声明

@interface Person : NSObject
{
//定义实例变量
//    * 姓名
    @public
    NSString *_name;
//    * 狗(人养了一条狗)
    Dog *_dog;
}
//喂狗:每喂一次,狗就会执行“吃”这个行为
- (void)feedWithDog:(NSString *)foodName;

//遛狗:每溜一次,狗就会执行“跑”这个行为
- (void)WalkWithDog;

@end

#pragma mark - Person类的实现

@implementation Person

//喂狗:每喂一次,狗就会执行“吃”这个行为
- (void)feedWithDog:(NSString *)foodName{
    //人拥有狗,让狗吃东西
    [_dog eat:foodName];
}

//遛狗:每溜一次,狗就会执行“跑”这个行为
- (void)walkWithDog{
    //让狗跑
    [_dog run];
}

@end




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

        //创建对象d
        Dog *d = [Dog new];
        //给对象实例变量赋值
        d->_color = kColorBlack;
        d->_sex = kSexYao;
        d->_speed = 80;
        d->_weight = 66.6f;

        //创建人对象
        Person *p = [Person new];
        //对象p的实例变量赋值
        p->_name = @"二郎神";
        //让人拥有狗
        p->_dog = d;
        //调用喂狗的方法
        [p feedWithDog:@"蟠桃"];
        [p feedWithDog:@"人参果"];
        //调用遛狗方法
        [p walkWithDog];


    }
    return 0;
}

8.对象作为方法的参数连续传递

/*
 枪类:
 名称:Gun
 属性:型号(_size),子弹个数(_bulletCount)
 行为:射击(shoot)

 士兵类
 名称:Soldier
 属性:姓名(_name)  生命(_life)  等级(_level)
 行为:开枪(fireByGun:)

 */

#import 
//枪类的声明
@interface Gun : NSObject
{
    @public
    NSString *_size; //型号
    int _bulletCount; //子弹数
}
//射击方法
- (void)shoot;

@end

//枪类的实现
@implementation Gun

//射击方法
- (void)shoot{
    //每射击一次,子弹数减一
    _bulletCount--;
    NSLog(@" %@ 正在突突突的射击, 剩余子弹:%d", _size, _bulletCount);
}

@end

//士兵类的声明
@interface Soldier : NSObject
{
    @public
//姓名(_name)
    NSString *_name;
//生命(_life)
    int _life;
//等级(_level)
    int _level;
}

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun;

@end

//士兵类的实现
@implementation Soldier

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun{
    //让枪射击
    [gun shoot];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建枪类
        Gun *g = [Gun new];

        //给对象的实例变量赋值
        g->_size = @"AK47";
        g->_bulletCount = 5;

        //创建士兵对象
        Soldier *s = [Soldier new];
        //给对象的实例变量赋值
        s->_name = @"嘎子";
        s->_life = 100;
        s->_level = 3;

        //调用开枪方法
        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];

        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];


    }
    return 0;
}

9.对象作为方法的参数连续传递2

/*
 枪类:
 名称:Gun
 属性:型号(_size),子弹个数(_bulletCount)
 行为:射击(shoot)

 士兵类
 名称:Soldier
 属性:姓名(_name)  生命(_life)  等级(_level)
 行为:开枪(fireByGun:)

 */

#import 
//枪类的声明
@interface Gun : NSObject
{
    @public
    NSString *_size; //型号
    int _bulletCount; //子弹数
}
//射击方法
- (void)shoot;

@end

//枪类的实现
@implementation Gun

//射击方法
- (void)shoot{
    //每射击一次,子弹数减一
    _bulletCount--;
    NSLog(@" %@ 正在突突突的射击, 剩余子弹:%d", _size, _bulletCount);
}

@end

//士兵类的声明
@interface Soldier : NSObject
{
    @public
//姓名(_name)
    NSString *_name;
//生命(_life)
    int _life;
//等级(_level)
    int _level;
}

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun;

@end

//士兵类的实现
@implementation Soldier

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun{
    //让枪射击
    [gun shoot];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建枪类
        Gun *g = [Gun new];

        //给对象的实例变量赋值
        g->_size = @"AK47";
        g->_bulletCount = 5;

        //创建士兵对象
        Soldier *s = [Soldier new];
        //给对象的实例变量赋值
        s->_name = @"嘎子";
        s->_life = 100;
        s->_level = 3;

        //调用开枪方法
        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];

        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];


    }
    return 0;
}

10.对象作为方法的参数连续传递3


#import 
//枪类的声明
@interface Gun : NSObject
{
@public
    NSString *_size; //型号
    int _bulletCount; //子弹数
}
//射击方法
- (void)shoot;

@end

//枪类的实现
@implementation Gun

//射击方法
- (void)shoot{
    //每射击一次,子弹数减一
    if(_bulletCount > 0){
        _bulletCount--;
        NSLog(@" %@ 正在突突突的射击, 剩余子弹:%d", _size, _bulletCount);
    }else{
        NSLog(@"没子弹了,还突突个毛线,赶紧跑, 剩余子弹数:%d", _bulletCount);
    }

}

@end

//士兵类的声明
@interface Soldier : NSObject
{
@public
    //姓名(_name)
    NSString *_name;
    //生命(_life)
    int _life;
    //等级(_level)
    int _level;
}

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun;

@end

//士兵类的实现
@implementation Soldier

//士兵开枪的方法
- (void)fireByGun:(Gun *)gun{
    //让枪射击
    [gun shoot];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建枪类
        Gun *g = [Gun new];

        //给对象的实例变量赋值
        g->_size = @"AK47";
        g->_bulletCount = 5;

        //创建士兵对象
        Soldier *s = [Soldier new];
        //给对象的实例变量赋值
        s->_name = @"嘎子";
        s->_life = 100;
        s->_level = 3;

        //调用开枪方法
        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];

        [s fireByGun:g];
        [s fireByGun:g];
        [s fireByGun:g];


    }
    return 0;
}

11.练习题讲解(二)

/*
 设计一个”学生“类
 1> 属性
 姓名
 生日 用结构体作为类的实例变量(生日)

 */

#import 
//定义结构体
typedef struct{
    int year;
    int month;
    int day;
}MyDate;

//学生类的声明
@interface Student : NSObject
{
    @public
    NSString *_name; //姓名
    MyDate _birthday; //生日
}

@end

//学生类的实现
@implementation Student


@end

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

        //创建对象
        Student *stu = [Student new];
        //给对象实例变量赋值
        stu->_name = @"六道杠红领巾";
        //方法一:强制转换
        stu->_birthday = (MyDate){1999, 9, 9};
//        问题:
//        struct Car{
//            int wheelCount;
//            int speed;
//            
//        }car1;
//        car1 =  (struct Car){2002, 2, 2};
//        int a[4] = {1, 2, 3 ,4};

        //方法二:定义一个新的结构体d2,给d2赋值,将d2赋值给_birthday
//        MyDate d2 = {2002, 2, 2};
//        stu->_birthday = d2;


        //方法三:分别赋值
        stu->_birthday.year = 2015;
        stu->_birthday.month = 3;
        stu->_birthday.day = 26;

        NSLog(@"%d年, %d月, %d日", stu->_birthday.year, stu->_birthday.month, stu->_birthday.day);

    }
    return 0;
}

12.NSString类介绍及用法


#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1.创建常量字符串
        NSString *s1 = @"班长是一个节操满满的好少年";
//
//        NSLog(@"s1 = %@", s1);

        //2.创建空字符串,给予赋值
//        NSString *s2 = [NSString new];
//        s2 = @"节操可以吃?";
//        NSLog(@"s2 = %@", s2);

        //3.创建格式化字符串
//        NSString *s3 = [NSString stringWithFormat:@"xxxx%02d.jpg", i];
//        for (int i = 0; i < 10; i++) {
//            NSString *s3 = [NSString stringWithFormat:@"xxxx%02d.jpg", i];
//            NSLog(@"%@", s3);
//        }

        //4.用一个存在的字符串赋值给新的字符串
//        NSString *s4 = [NSString new];
        NSString *s5 = [[NSString alloc] initWithString:s1];
        NSLog(@"s5 = %@", s5);
//        s4 = s1;
    }
    return 0;
}

13.NSString字符串长度计算方法

#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //OC中无论是汉字还是英文占1个字节
       //1.纯英文字符
//        NSString *s1 = @"addgfg";
//        int len1 = [s1 length];
//        NSLog(@"len1 = %d", len1); //6

        //2.纯中文
//        NSString *s2 = @"学挖掘机哪家强";
//        int len2 = [s2 length];
//        NSLog(@"len2 = %d", len2); //7

        //char字符串 输出汉字 ,汉字占3个字节
//        char *s3 = "学挖掘机哪家强";
//        int len3 = strlen(s3);
//        NSLog(@"len3 = %d", len3); //21

        //3.中文和英文混编
        NSString *s4 = @"学挖掘机哪家强OC";
        int len4 = [s4 length];
        NSLog(@"len2 = %d", len4);



    }
    return 0;
}

你可能感兴趣的:(OC)