首页 > 其他 > 详细

黑马程序员-----对象的存储细节

时间:2015-12-21 01:50:09      阅读:116      评论:0      收藏:0      [点我收藏+]

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----

  

第一讲  对象的存储细节

 

本小节知识点:

1、【理解】对象的存储细节

2、【掌握】使用一个类创建多个对象

 

一、对象的存储细节

类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储与此。

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 {
 5 @public
 6     int _age;
 7     NSString *_name;
 8 }
 9 //行为
10 -(void)run;
12 @end
13 @implementation Person
14 -(void)run{
15     NSLog(@"人正在跑");    
17 }
18 @end
19 int main(int argc, const char * argv[])
20 {   
22     @autoreleasepool {
        
24        Person *p = [Person new];      
26         p->_name = @"柯南";
27         p->_age = 13;      
29         NSLog(@"姓名:%@,年龄:%d",p->_name,p->_age);
31         [p run];
32         
33         //[Person new]做了三件事情
34         //1) 申请内存空间
35         //2) 给实例变量初始化
36         //3) 返回空间的首地址
37         
38         //1、申请的空间在内存的哪个区
39         //  new 的时候申请的空间在内存的堆区(程序动态分配的内存空间)
40         //  当new的时候内存的布局是怎样的
41         // 初始化的时候:
42         //如果实例变量是基本数据类型,此时给初始化为0
43         //如果 。。。。。OC字符串类型            null
44         
45         //2、实例变量又保存在什么地方
46         // 堆区
47         // p(指针变量)  存放在栈区
48         
49         
50         //3、对象方法保存在什么地方
51         // 代码区
52         
53         //4、为什么使用 [p run];  就可以调用方法了?如何调用的
54         //首先找p对应的堆区的空间,然后找到 _isa指针,再找到_isa指向代码区的空间,
55         //然后到该空间中找 方法
56         
57         //5、一个类可以创建多个对象
58         //又创建类一个对象p1
59         Person *p1 = [Person new];
60         p1->_age = 10;
61         p1->_name = @"小叮当";
62         NSLog(@"姓名:%@,年龄:%d",p1->_name,p1    ->_age);
63 
64         [p1 run];
65     }
66     return 0;
67 }

 技术分享技术分享

 

 

第二讲  #pragma mark指令的使用

本小节知识点:

1、【了解】#pragma mark指令的使用

1#pragma mark指令的使用

功能:简单来说就是对代码的分组,方便代码查找和导航用的。

技术分享

 

 

第三讲   函数和对象方法的区别

对象方法:

-(void)run;

 

1、对象方法的实现只能写在@implementation @end中,

       对象方法的声明只能写在@interface….@end

2、对象方法都以 - 号开头,类方法都以 + 号开头

3、对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用

4、函数属于整个文件,可以写在文件中的任何位置,包括@implementation@end

       中,但写在@interface@end会无法识别,函数的声明可以在main函数内部也可 

       以在main函数外部。

5、对象方法归类------->对象所有

 

函数:

Void run(){

 

}

1、所有的函数都是平行的

2、函数不存在隶属关系

3、使用的时候可以直接调用

4、不可以访问对象中的成员变量

 

第四讲  常见错误汇总

1、常见错误

1@interface @end @implementation …@end 不能嵌套包含

          OC是弱语法,可以只有@implementation,但实际开发中千万不要这样。

           @implementation Car : NSObject

          {

                @public

                 int _lunzi;

          }

             @end

             //没有报错 但不能这么写

 2)只有类的声明没有类的实现

            @interface @end @implementation @end  不能缺少

 3)漏写@end

 4)两个类的对象声明顺序(可以把顺序打乱)

 5)成员变量没有写在{}

 6)方法的声明写在了{}里面

 7)在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而

               对立存在

 8)方法无法像函数那样的调用

 9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆

 10)类的实现可以写在main函数后面,在使用之前只要有声明就可以

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Car : NSObject
 4 {
 5     @public
 6     int _lunzi;
 7     //错误的  不允许被嵌套
 8    // @interface Person : NSObject
 9     
10    // @end
11 }
12 -(void)stop;
13 @end
14 
15 int main(int argc, const char * argv[])
16 {
17 
18     @autoreleasepool {
19         
20         Car *car = [Car new];
21         car->_lunzi = 4;
22         NSLog(@"%d",car->_lunzi);
23         //调用没有实现的方法,会出现经典错误
24         @try {
25              //有可能会出错的代码
26              [car stop];//语法检查上没有问题,运行是错误的
27         }
28         @catch (NSException *exception) {
29             //错误的处理方法
30             NSLog(@"您调用的方法没有实现!");
31             NSLog(@"%@",exception );  //打印错误的信息
32         }
33         @finally {
34             printf("xxxxxxx\n");
35         }       
37     }
38     return 0;
39 }

//  /Users/xiaokang/Desktop/OC自学笔记/自学笔记/自学基础视频笔记/自学基础笔记/06-常见错误汇总/06-常见错误汇总/main.m:37:17: Method definition for ‘stop‘ not found

@implementation Car

 

@end

 

第五讲   对象和方法之间的关系

本小节知识点:

1、【掌握】对象作为方法的参数

2、【掌握】对象作为方法的返回值

 

1、对象作为方法的参数

2、对象作为方法的返回值

 1 /*
 2    对象和方法之间的关系
 3    1)对象作为方法的参数    
 5      //      方法名     形参类型   形参数名
 6      -(void)dispPerson:(Person *) person;
 8      Person *p1 = [Person new]; 
10      [p dispPerson:p1]   //对象作为方法的实参
11  
12    2)对象作为方法的返回值 
14  */
17 
18 #import <Foundation/Foundation.h>
19 typedef enum {kSexMan,kSexWomen,kSexYao} Sex; //定义一个枚举类型
20 
21 #pragma mark Person类的声明
22 //Person类的声明
23 @interface Person : NSObject
24 {
25     @public
26     NSString *_name;
27     Sex _sex;
28 }
29 #pragma mark 对象作为方法的参数
30 //对象作为方法的参数
31 -(void)dispPerson:(Person *) person;
32 #pragma mark 对象作为方法的返回值
33 // 对象作为方法的返回值
34 -(Person *)changSex:(Person    *) person;
35 @end
36 
37 #pragma mark -
38 #pragma mark Person类的实现
39 //Person类的实现
40 @implementation Person
41 -(void)dispPerson :(Person *) person{
42 
43     NSLog(@"姓名:%@,性别:%d",person->_name,person->_sex);
44 }
45 // 对象作为方法的返回值           p2
46 -(Person *)changSex:(Person    *) person{
47 
48     //修改性别
49     person->_sex = kSexWomen;
50        return person;
51 }
53 @end
54 
55 int main(int argc, const char * argv[])
56 {
57 
58     @autoreleasepool {
59         //创建对象
60         Person *p = [Person new];
61         //创建对象
62         Person *p1 = [Person new];
63         
64         p1->_name = @"凤姐";
65         p1->_sex = kSexWomen;
66         
67         Person *p2 = [Person new];
68         p2->_name = @"张三丰";
69         p2->_sex = kSexMan;
70         
71         [p dispPerson:p2];
72         [p dispPerson:p1];
73         
74          //修改性别
75         //[p changSex:p2];  这种也可以调用
76         Person *p3 = [p changSex:p2]; //p3和p1都指向同一个空间
77         NSLog(@"姓名:%@,性别:%d\n",p2->_name,p2->_sex);
78     }
79     return 0;
80 }
  1 /*
  2 对向和方法的之间的关系练习题
  3 
  4 思考&实现1:
  5  设计一个“狗”类
  6 1、属性
  7        颜色
  8        速度(单位是m/s)
  9        性别
 10        体重(单位是kg)
 11       
 12 2、行为
 13      吃:没吃一次,体重增加0.5kg,输出吃完后的体重
 14      吠(叫):输出所有的属性
 15      跑:每吃一次,体重减少0.5kg,输出速度和跑完后的体重
 16      比较颜色:跟别的狗比较颜色,如果一样,两个值做减法得零,返回NO(零   
 17                            值),不一样,做减法得到非零值,返回YES(1)
 18 
 19       比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)
 20 */
 21 #import <Foundation/Foundation.h>
 22 //定义狗的性别
 23 typedef enum{kSexMale,kSexFemale}Sex;
 24 //定义狗的颜色
 25 typedef enum {kColorRed,kColorYellow,kColorGreen}Color;
 26 
 27 #pragma mark Dog类的声明
 28 //狗类的声明
 29 @interface  Dog : NSObject
 30 {
 31     @public
 32     Color _color;   //狗的颜色
 33     int   _speed;   //狗的速度
 34     Sex   _sex;     //狗的性别
 35     float _weight;  //狗的体重
 36 }
 37   //狗的行为
 38 -(void)eat:(NSString *)foodName;   //体重+0.5kg
 39 -(void)bark;   //输出所有属性
 40 -(void)run;    //体重-0.5kg
 41 -(BOOL)isCompareColorWithOther:(Dog *)dog; //比较颜色
 42 -(int)isCompareSpeedWithOther:(Dog *)dog;    //比较速度差
 43 
 44 @end
 45 #pragma mark -
 46 #pragma mark Dog类对象方法的实现
 47 //Dog类对象方法的实现
 48 @implementation  Dog
 49 -(void)eat:(NSString *)foodName{
 50     _weight += 0.5f;
 51     NSLog(@"狗正在吃%@,还打了个隔!",foodName);
 52 }   //体重+0.5kg
 53 -(void)bark{
 54     
 55     NSLog(@"颜色:%d,速度:%d,性别:%d,体重:%.2f",_color,_speed,_sex,_weight);
 56 
 57 }   //输出所有属性
 58 -(void)run{
 60     _weight -= 0.5f;
 61     NSLog(@"狗正在以%d的速度向前疯跑!",_speed);
 62 }    //体重-0.5kg
 63 
 64 //比较狗的颜色
 65 -(BOOL)isCompareColorWithOther:(Dog *)dog{    
 67     if(_color == dog->_color){
 68         return YES;  //颜色相同
 69     }else{
 70         return NO;
 71     } 
 73 }
 75 //比较狗的速度
 76 -(int)isCompareSpeedWithOther:(Dog *)dog{
 77     
 78     return _speed - dog->_speed;
 79 }    //比较速度差
 80 
 81 @end
 82 
 83 int main(int argc,const char *argv[]){
 84     
 85     @autoreleasepool{
 86         
 87         //创建两条狗对象
 88           Dog *d1 = [Dog new];
 89         
 90         d1->_color = kColorYellow;
 91         d1->_speed = 60;
 92         d1->_sex = kSexMale;
 93         d1->_weight = 30;
 94         
 95         [d1 bark]; //狗叫  输出所有属性
 96         //狗在吃
 97         [d1 eat:@"狗正在吃一根热狗!"];
 98         [d1 eat:@"狗正在吃一根火腿肠!"];
 99         [d1 bark];
100         [d1 run];
101         [d1 bark];
102         
103         Dog *d2 = [Dog new];
104         
105         d2->_color = kColorYellow;
106         d2->_speed = 50;
107         d2->_sex = kSexFemale;
108         d2->_weight = 25;
109         [d2 bark];
110          [d2 run];
111         [d2 bark];
112         
113         [d2 eat:@"狗正在吃一根热狗!"];
114         [d2 eat:@"狗正在吃一根火腿肠!"];
115         [d2 bark];
116 
117         //比较狗颜色
118           BOOL isSameColor =  [d1 isCompareColorWithOther:d2];
119         NSLog(@"isSameColor = %d",isSameColor);
120         
121         //计算狗速度差
122         int cha = [d1 isCompareSpeedWithOther:d2];
123         NSLog(@"cha = %d",cha);
124     }
125     return 0;
126 }
/*
2、结合前面的“狗”类,设计一个“人”类
     1、属性
            姓名
            狗(养了一条狗)
           
    2、行为
          喂狗:每喂一次,狗就会执行“吃”这个行为
          遛狗:每溜一次,狗就会执行“跑”这个行为

*/
#import <Foundation/Foundation.h>
//定义狗的性别
typedef enum{kSexMale,kSexFemale,kSexYao}Sex;
//定义狗的颜色的枚举
typedef enum {kColorWhite,kColorYellow,kColorBlack}Color;
#pragma mark -
#pragma mark 狗类的声明
//狗的声明
@interface  Dog : NSObject
{
    //狗类的实例变量
@public
    Color _color;  //狗的颜色
    int   _speed;  //狗的速度
    Sex   _sex;    //狗的性别
    float _weight; //狗的体重
}

//狗的行为
-(void)eat:(NSString *)foodName; //体重+0.5kg
-(void)bark;
-(void)run;     //体重-0.5kg
//比较狗毛的颜色
-(BOOL)isCompareColorWithOther:(Dog *)dog;
//比较速度
-(int)isCompareSpeedWithOther:(Dog *)dog;
@end

#pragma mark Dog类的实现
//Dog类对象方法的实现
@implementation  Dog
//狗的行为
-(void)eat:(NSString *)foodName{
    _weight += 0.5f;
    NSLog(@"狗狗正在吃%@,吃完后还打了个隔!",foodName);
} //体重+0.5kg
-(void)bark{
    NSLog(@"颜色:%d,速度:%d,性别:%d,体重:%.2f",_color,_speed,_sex,_weight);
}

-(void)run{
    _weight -= 0.5f;
    NSLog(@"狗狗正在以%d的速度向前疯跑!",_speed);
}   //体重-0.5kg
//比较狗毛的颜色
-(BOOL)isCompareColorWithOther:(Dog *)dog{
    //当前狗的颜色   另外一条狗的颜色
    if(_color == dog->_color){
        return YES; //颜色相同
    }else{
        return NO;
    }
}
//比较速度
-(int)isCompareSpeedWithOther:(Dog *)dog{
    return _speed - dog->_speed;
}

@end
#pragma mark -
#pragma mark 人这个类的声明
@interface Person : NSObject
{
     @public
    NSString *_name;
    Dog *_dog;   //人养的狗
}
   //行为
   //喂狗
-(void)feedDog:(NSString *)foodName;
   //遛狗
-(void)liuDog;
@end
#pragma mark 人这个类的声明
@implementation  Person
//喂狗
-(void)feedDog:(NSString *)foodName{
    [_dog eat:foodName];
}
//遛狗
-(void)liuDog{
    [_dog run];
}

@end

int main(int argc,const char *argv[]){
    
    @autoreleasepool{
        //创建两条狗
          Dog *d1 = [Dog new];
        
        d1->_color = kColorYellow;
        d1->_speed = 60;
        d1->_sex = kSexMale;
        d1->_weight = 30;
        
        [d1 bark];
        
        [d1 eat:@"一根热狗"];
        [d1 eat:@"一根火腿"];
        
        [d1 bark];
        
        Dog *d2 = [Dog new];
        
         d2->_color = kColorBlack;
        d2->_speed = 50;
        d2->_sex = kSexFemale;
        d2->_weight = 25;
        
        [d2 bark];
        //比较狗的颜色
        //if  1 相同   0  不同
        BOOL isSameColor = [d1 isCompareColorWithOther:d2];
        NSLog(@"isSameColor = %d",isSameColor);
        
        //比较狗的速度差
        int cha = [d1 isCompareSpeedWithOther:d2];
        NSLog(@"速度差 = %d",cha);
        
        
        //创建人这个对象
        Person *p = [Person new];
        //给 人 p 一个 dog
        p->_dog = d1;
        
        //人要喂狗
        [p feedDog:@"骨头"];
        [p->_dog run ];
        
    }
    return 0;
}

如图:人要喂狗是怎么传递的

   技术分享

 

 

第六讲   对象作为方法的参数连续传递

本小节知识点:

1、【掌握】对象作为方法的参数连续传递

 

1、对象作为方法的参数连续传递

实现功能:士兵开枪  枪射击子弹

 

枪类:

 名称: Gun

 属性:型号(_size),子弹个数(_bulletCount)

 行为:射击

 

人类:

 名称:Soldier

 属性:姓名(_name)   life  level(等级)

 行为      开枪     

 1 /*
 2  对象作为方法的参数连续传递
 3  
 4  实现功能:士兵开枪  枪射击子弹
 5  
 6  枪类:
 7  名称:Gun
 8  属性:型号(_size),子弹个数(_bulletCount)
 9  行为:射击
10  
11  人类
12  名称:Soldier
13  属性:姓名(_name)  life level(等级)
14  行为:跑   蹲   开枪  跳
15  */
16 #import <Foundation/Foundation.h>
17 #pragma mark -
18 #pragma mark 枪类的声明
19 @interface  Gun : NSObject
20 {
21     @public
22     //实例变量
23     NSString *_size;     //枪的型号
24     int _bulletCount;    //枪的子弹个数
25 }
26 //行为
27 -(void)shoot;  //射击
28 
29 @end
30 #pragma mark 枪类的实现
31 @implementation Gun
32  -(void)shoot{
33     
34     NSLog(@"%@ 正在 突突的射击。。。",_size);
35     
36 } //射击
37 @end
38 #pragma mark -
39 #pragma mark 士兵这个类的声明
40 @interface Soldier  :  NSObject
41 {
42    @public
43     NSString *_name;
44     int life ;
45     int  level;
46 }
47 //行为
48  -(void)fireByGun:(Gun *) gun; //士兵开枪
49  @end
50  #pragma mark 士兵这个类的实现
51  @implementation Soldier
52  -(void)fireByGun:(Gun *) gun{
53     
54     //让枪射击
55      [gun shoot];
56     
57 } //士兵开枪
58 @end
59 int main (){
60     @autoreleasepool{      
63     //创建一个士兵对象
64     Soldier *s = [Soldier new];
65     s->_name = @"三多";
66     s->life = 98;
67     s->level = 2;
68         //创建一个枪对象
69         Gun *gun = [Gun new];
70         gun->_bulletCount = 3 ;
71         gun->_size = @"小米加步枪";
72         //士兵开枪
73         [s fireByGun:gun];
74       // [s fireByGun:gun];
75       // [s fireByGun:gun];
76     }
77     
78     return 0;
79 }

//基本实现了,发现开枪后子弹数没少

//第二步开始实现每开枪一次子弹数减少一个,还要判断子弹数大于0的时候,才会

//减少

 1 /*
 2  对象作为方法的参数连续传递
 3  
 4  实现功能:士兵开枪  枪射击子弹
 5  
 6  枪类:
 7  名称:Gun
 8  属性:型号(_size),子弹个数(_bulletCount)
 9  行为:射击
10  
11  人类
12  名称:Soldier
13  属性:姓名(_name)  life level(等级)
14  行为:跑   蹲   开枪  跳
15  */
16 #import <Foundation/Foundation.h>
17 #pragma mark -
18 #pragma mark 枪类的声明
19 @interface  Gun : NSObject
20 {
21     @public
22     //实例变量
23     NSString *_size;     //枪的型号
24     int _bulletCount;    //枪的子弹个数
25 }
26 //行为
27 -(void)shoot;  //射击
28 
29 @end
30 #pragma mark 枪类的实现
31 @implementation Gun
32  -(void)shoot{
33     //每射击一次,子弹的个数-1    基本完成后,发现子弹个数没变,第二步实现子弹
34      if(_bulletCount>0){
35       
36     
37     _bulletCount --;
38     NSLog(@"%@ 正在 突突的射击。。。,剩余子弹:%d",_size,_bulletCount);
39      }else{
40          NSLog(@"没有子弹还突突个毛线!");
41      }
42 } //射击
43 @end
44 #pragma mark -
45 #pragma mark 士兵这个类的声明
46 @interface Soldier  :  NSObject
47 {
48    @public
49     NSString *_name;
50     int life ;
51     int  level;
52 }
53 //行为
54  -(void)fireByGun:(Gun *) gun; //士兵开枪
55  @end
56  #pragma mark 士兵这个类的实现
57  @implementation Soldier
58  -(void)fireByGun:(Gun *) gun{
59     
60     //让枪射击
61      [gun shoot];
62     
63 } //士兵开枪
64 @end
65 int main (){
66     @autoreleasepool{
67         
68     //创建一个士兵对象
69     Soldier *s = [Soldier new];
70     s->_name = @"三多";
71     s->life = 98;
72     s->level = 2;
73         

//创建一个枪对象 74 Gun *gun = [Gun new]; 75 gun->_bulletCount = 3 ; 76 gun->_size = @"小米加步枪"; 77 //士兵开枪 78 [s fireByGun:gun]; 79 [s fireByGun:gun]; 80 [s fireByGun:gun]; 81 [s fireByGun:gun]; 82 } 83 84 return 0; 85 }

 

 

        实现功能:士兵开枪  枪射击子弹

        子弹类

             名称:Bullet

             属性:子弹个数,型号(_model)

  

  1 /*
  2  对象作为方法的参数连续传递
  3  
  4  实现功能:士兵开枪  枪射击子弹
  5  
  6  枪类:
  7  名称:Gun
  8  属性:型号(_size),子弹个数(_bulletCount)
  9  行为:射击
 10  
 11  人类
 12  名称:Soldier
 13  属性:姓名(_name)  life level(等级)
 14  行为:跑   蹲   开枪  跳
 15  
 16  对象作为方法的参数连续传递 2
 17  实现功能:士兵开枪  枪射击子弹
 18  
 19  子弹类(弹夹)
 20  名称:Bullet
 21  属性:子弹个数,型号(_model)
 22  
 23  //要求士兵在射击的时候,不但要给一把枪,还要给 一个弹夹
 24  //子弹不能为负数
 25  */
 26 #import <Foundation/Foundation.h>
 27 
 28 #pragma mark -
 29 #pragma mark 子弹类的声明
 30 //子弹类的声明
 31 @interface Bullet : NSObject
 32 {
 33     @public
 34     NSString  *_model;    //子弹的型号
 35     int  _bulletCount;   //子弹的个数
 36     
 37 }
 38 //行为
 39 
 40 @end
 41 #pragma mark 子弹类的声明
 42 @implementation Bullet
 43 
 44 @end
 45 #pragma mark -
 46 #pragma mark 枪类的声明
 47 @interface  Gun : NSObject
 48 {
 49     @public
 50     //实例变量
 51     NSString *_size;     //枪的型号
 52     }
 53 //枪的行为
 54 -(void)shoot:(Bullet *)bullet;
 55 
 56 @end
 57 #pragma mark 枪类的实现
 58 @implementation Gun
 59 -(void)shoot:(Bullet *)bullet{
 60     //判断子弹数>0
 61     //子弹类对象(弹夹)中的子弹的个数
 62     if(bullet->_bulletCount>0){
 63        //子弹数 -1
 64         bullet->_bulletCount --;
 65         NSLog(@"啪啪啪,,,枪在射击,剩余子弹:%d",bullet->_bulletCount);
 66     
 67     }else{
 68         //如果子弹数<0,提示没子弹了
 70         NSLog(@"没子弹了,没子弹了");
 71     }    
 73 }
 74 @end
 75 #pragma mark -
 76 #pragma mark 士兵这个类的声明
 77 @interface Soldier  :  NSObject
 78 {
 79 @public
 80     NSString *_name;
 81     int life ;
 82     int  level;
 83 }
 84 //行为
 85 -(void)fireByGun:(Gun *)gun andBullet:(Bullet *)bullet;
 86        //士兵让枪装上子弹(弹夹)来射击
 87 @end
 88 #pragma mark 士兵这个类的实现
 89 @implementation Soldier
 90 -(void)fireByGun:(Gun *)gun andBullet:(Bullet *)bullet{
 91 //士兵让枪装上子弹(弹夹)来射击
 92     //子弹作为参数传递给射击的方法
 93     [gun shoot:bullet];    
 95 }
 96 @end

 99 int main (){
100     @autoreleasepool{       
104         //创建一个士兵对象
105         Soldier *s = [Soldier new];
106         s->_name = @"三多";
107         s->life = 98;
108         s->level = 2;
109         //创建一个枪对象
110         Gun *gun = [Gun new];
111      
112         gun->_size = @"小米加步枪";
113         
114         //创建子弹类对象
115         Bullet *myBullet = [Bullet new];
116         myBullet->_model = @"5mm口径";
117         myBullet->_bulletCount = 3;
118         //士兵开枪
119        [s fireByGun : gun andBullet : myBullet];
120         [s fireByGun : gun andBullet : myBullet];
121         [s fireByGun : gun andBullet : myBullet];
122         [s fireByGun : gun andBullet : myBullet];
123     //  士兵  开枪      枪对象方法        子弹对象方法  连续传递了两次
124     }
125     
126     return 0;
127 }

 

第七讲   练习题讲解

思考&实现1

设计一个“学生”类

1)属性

   姓名

   生日

// 这是一种方法,因为在题目中没有给出行为 

用结构体作为类的实例变量(生日)

 1 #import <Foundation/Foundation.h>
 2 
 3 typedef struct {
 4    
 5     int year;
 6     int month;
 7     int day;
 8 }MyDate ;
 9 
10 @interface Student : NSObject
11 {
12     @public
13     NSString *_name;   //姓名
14     MyDate _birthday;  //生日
15 }
16 
17 @end
18 @implementation Student
19 
20 @end
21 
22 int main(int argc, const char * argv[])
23 {
24 
25     @autoreleasepool {
26         
27          //创建一个学生类对象
28         
29         //第一种方法
30         Student *stu = [Student new];
31         
32         stu->_birthday = (MyDate){1981,12,12};
33         NSLog(@"%d,%d,%d",stu->_birthday.year,stu->_birthday.month,stu->_birthday.day);
34         //第二种方法
35         //定义一个结构体变量
36         MyDate d1 = {1982,12,11};
37         stu->_birthday = d1;
38          NSLog(@"%d,%d,%d",stu->_birthday.year,stu->_birthday.month,stu->_birthday.day);
39         
40         //第三种方法,逐个赋值
41         stu->_birthday.year = 2014;
42         stu->_birthday.month = 11;
43         stu->_birthday.day   =  10;
44         NSLog(@"%d,%d,%d",stu->_birthday.year,stu->_birthday.month,stu->_birthday.day);
45     }
46     return 0;
47 }

 

 

第八讲  NSString类介绍及用法

本小节知识点:

【掌握】NSString常见方法

NSStringObjective-C中核心处理字符串的类之一。

NSMutableString

NSDictionary

NSArray               //就业班内容

 

1)创建常量字符串,注意使用“@”符号。

   NSString   *astring = @"This is a String!";

  //c语言的

   char *s = "abc";

    s = "bcd";

#import <Foundation/Foundation.h>

int main(int argc,const char *argv[]){
    @autoreleasepool{
      
        //NSString 是OC中字符串处理的类

        //1、创建一个字符串  (第一种方法)

        NSString *s =@"banzhang jiecao diaole";
       
        //2、输出一个字符串
        NSLog(@"%@",s);

        //NSString是一个类  (第二种方法)
        NSString *s1 = [NSString new];
        s1 = @"jian le ma";
        NSLog(@"%@",s1);
    
        //3、创建字符串的第三种方法
        //格式化创建字符串(按照指定的格式创建字符串)
        // NSString *imgName = [NSString stringWithFormat:@"xxxx%02d.jpg",i];
                                            //类方法
        for(int i=0;i<10;i++){
            NSString *imgName = [NSString stringWithFormat:@"xxxx%02d.jpg",i];
            NSLog(@"%@",imgName);
            NSString *imgName = [NSString stringWithFormat:@"xxxx%02d-%02d.jpg",i,i+1];
            NSLog(@"%@",imgName);
     }
            //用一个已经存在的字符串创建一个新的字符串 (第四种方法)
            NSString *s2 = [[NSString alloc] initWithString:s1];
            NSLog(@"%@",s2);  
            
        //注意:使用NSLog是不能打印C中的字符串的
        //    char *str = "淡定度";
        //    NSLog(@"%@",str);
      
    }
    return 0;
}

 

第九讲  NSString字符串长度计算方法

本小节知识点:

【掌握】NSString字符串长度计算

1NSString字符串长度计算

 1 //  06-NSString字符串长度计算方法
 2 #import <Foundation/Foundation.h>
 3 
 4 int main(int argc, const char * argv[])
 5 {
 6 
 7     @autoreleasepool {
 8         
 9         //计算NSString 字符串的长度
10         
11         //1)字符串是纯英文的
12         NSString *s1 = @"ban zhang ";
13         NSUInteger  len = [s1 length];
14         NSLog(@"len = %ld",len);
15         
16         //2)字符串是纯中文
17         //OC字符串中中英文都是一个字符
18         NSString *s2 = @"班长的节操";
19         len =[s2 length];
20         NSLog(@"len = %ld",len);
21         
22         //3)中英文混合
23         NSString  *s3 = @"班长!";
24         len = [s3 length];
25         NSLog(@"len = %ld",len);
26         
27         //C语言中
28         char *s ="班长的节操";
29        // int len1 = strlen(s);
30         printf("len1 = %ld\n",strlen(s));
31     }
32     return 0;
33 }

 

第十讲  OC多文件开发介绍和实现步骤

本小节知识点:

【了解】为什么要使用多文件

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

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

1 Person.h      Person类的声明文件

2Person.m      Person类的实现文件

3Dog.h             Dog类的声明文件

4Dog.m            Dog类的实现文件

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

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

 

补充:import有两个作用:

     1、和include一样,完完全全的拷贝文件的内容;

     2、可以自动防止文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)

 

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

 

二、多文件实现步骤

黑马程序员-----对象的存储细节

原文:http://www.cnblogs.com/xiaokang520/p/5062338.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!