OC基础学习第2天

来源:互联网 发布:芒果tv有Mac 版吗 编辑:程序博客网 时间:2024/06/01 14:24

//*************对象的存储细节*********

//创建对象

Person *p = [Person new];


[Person new]做了3件事情

// 1) 申请内存空间

// 2)给实例变量初始化

// 3) 返回空间的首地址

1、申请的空间在内存的哪个区?

//   new 的时候申请的空间在内存的堆区(程序动态分配的内存空间)

//   new的时候内存的布局是这么样的

//初始化的时候:

//如果实例变量是基本数据类型,此时给初始化为0

//如果  。。。。OC字符串类型             null

2、实例变量又保存在什么地方//即实例对象

//  堆区(动态分配内存)

//  p(指针变量)存放在栈区(存放局部变量)

3、对象方法保存在什么地方

//  代码区

4、为什么使用 [p run];就可以调用方法了 ?如何调用的

//每一个对象都包含一个isa指针.这个指针指向当前对象所属的类。

// 首先找p对应的堆区的空间,然后找到 _isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法

5、一个类可以创建多个对象


当使用一个类创建多个对象的时候,注意:

1)不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同



//***********  #pragma mark指令的使用 ******

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

1)第一种用法:分隔线

#pragma mark -

// 注意   #pragma mark – “-”后面不能有空格。

2)第二种用法:

#pragma mark 分组(标识)名称


#pragma mark – 标识名称

补充:

#warning 处理未完成的任务, 方法


//*********** 函数和对象方法的区别 ***********

对象方法:

-(void)run;


(1)对象方法的实现只能写在@implementation...@end,对象方法的声明只能写在@interface...@end中间

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

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

(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end,但写在@interface...@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。

(5)对象方法归类\对象所有


函数:

void run(){

    

}

(1)所有的函数都是平行的

(2)函数不存在隶属关系

(3)使用的时候可以直接调用

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


//***********  对象和方法之间的关系  ********

1)对象作为方法的参数

//      方法名       形参数类型    形参数名

-(void)dispPerson:(Person *) person;


Person *p1 = [Person new];

[p dispPerson:p1] //对象作为方法的实参


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

-(Person *)changePerson:(Person *)person{

    person->name =@"唐僧";

   return person;

}


//*****************  对象作为方法的参数连续传递  ***************

/*

 士兵开枪 枪射击子弹

 

 枪类:

 名称:Gun

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

 行为:射击

 

 人类

 名称:Soldier

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

 行为:跑 开枪 

 

 子弹类(弹夹)

 名称:Bullet

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

 

 

 //要求士兵在射击的时候,不但要给一把枪,还要给一个弹夹才能射击

 //子弹不能为负数

 

 */

#import <Foundation/Foundation.h>

#pragma mark -子弹类的定义

@interface Bullet:NSObject

{

@public;

   int _bulletCount;

}


@end

#pragma mark -子弹类的实现

@implementation Bullet

@end

//#pragma mark -

#pragma mark -Gun类定义

@interface Gun:NSObject

{

}

-(void)shoot:(Bullet *)bullet;

@end

#pragma  mark -Gun类实现

@implementation Gun

-(void)shoot:(Bullet *)bullet{

   if (bullet->_bulletCount >0) {

        bullet->_bulletCount--;

        NSLog(@"枪正在凸凸凸射击!!剩余的子弹为:%d",bullet->_bulletCount);

    }else{

        NSLog(@"子弹都没有了,射个毛!!!");    }

}

@end


#pragma mark -Soldier类定义

@interface Soldier:NSObject

{

    

}

-(void)shootByGun:(Gun *)gun andBullet:(Bullet *)bullet;

@end

#pragma  mark -Soldier类实现

@implementation Soldier

-(void)shootByGun:(Gun *)gun andBullet:(Bullet *)bullet{

    [gun shoot:bullet];

}


@end


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

    @autoreleasepool {

        Bullet *b1 =[Bullet new];

        b1->_bulletCount=3;

        

        Gun *ak47 =[Gun new];

        Soldier *s1 =[Soldier new];

        

        NSLog(@"现在大兵手上的子弹还有%d颗!!!",b1->_bulletCount);

        [s1  shootByGun:ak47 andBullet:b1];

        [s1  shootByGun:ak47 andBullet:b1];

        [s1  shootByGun:ak47 andBullet:b1];

        [s1  shootByGun:ak47 andBullet:b1];

    }

   return 0;

}


//*********************************************


//  思考&实现1:设计一个学生 1>属性

//  * 姓名

//  * 生日

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



#import <Foundation/Foundation.h>

typedef struct {

   int year;

   int month;

   int day;

}Date;


@interface Student : NSObject

{

@public;

    NSString *_name;

    Date _birthday;

}

@end


@implementation Student


@end


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

    @autoreleasepool {

        

        Student *p1 =[Student new];

        p1->_name =@"逗比";

       //初始化p1

        //1种方法 强制类型转换

        p1->_birthday =(Date){1991,10,23};

        

        //2种方法 定义一个结构体变量

        Date b1 ={1993,4,21};

        p1->_birthday =b1;

        

        //3种方法逐个赋值

        p1->_birthday.year =1993;

        p1->_birthday.month =1;

        p1->_birthday.day =25;

        

    }

   return 0;

}




0 0
原创粉丝点击