黑马程序员——OC—类和对象的使用

原创 2015年07月08日 10:33:09

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

类和对象的使用

1、对象的存储细节

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


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

[p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存储于类中的方法,执行。


isa是对象中的隐藏指针,指向创建这个对象的类。


在OC中存在一个名为id的类型,这个和上面所说这个isa指针有一定的联系。


C代码


typedef struct  objc_object {

Class isa;

} *id;


其中class类型为指向objc_class结构体的指针类型。


这些对象在内存中都是由其地址唯一标示,所有的对象都是id类型的。


2、使用一个类创建多个对象

Car *car2 = [Car new];

Car *car3 = [Car new];


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

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



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


对象方法:

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

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

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

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

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

函数:

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

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

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

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


4、常见错误

(1)@interface  @end和@implementation  @end不能嵌套包含

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


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

         只有@interface没有@implementation时,程序编译能够通过,但是执行报错,错误如下:


(3)漏泄@end

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

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

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

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

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

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

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




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

(1)对象作为方法的参数

假设有Person类:

Person类有name、sex属性


假设实例化Person的对象

Person *p = [Person new];

p->name = “凤姐”;

p->sex = “女”;

……

……


- (void) displayPerson:(Person *)person{

        NSLog(“姓名:%@“,person->name);

        NSLog(“姓名:%@“,person->sex);

}

……

……


(2)对象做方法的返回值

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

person->name = @“唐僧”;

person->sex = @“男”;

person->age = person->age + 1;

return person;

}


Person *p2 = [d changePerson:p1];

[d displayPerson:p2];



(3)对象作为方法的参数连续传递

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

枪类:

名称:Gun

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

行为:射击


人类:

名称:Soldier

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

行为:跑  蹲  开枪  跳

/*
 
 士兵开枪 枪射击子弹
 
 枪类:
 名称:Gun
 属性:型号(_size),子弹个数(_bulletCount)
 行为:射击
 
 人类
 名称:Soldier
 属性:姓名(_name)    life    level(等级)
 行为:跑 蹲 开枪  跳

 
 */


#import <Foundation/Foundation.h>

#pragma mark 枪类声明
@interface Gun:NSObject
{
  //实例变量
    @public
    NSString *_size;  //枪的型号
    int _bulletCount; //枪的子弹数

}

//行为
-(void)shoot;
@end
#pragma mark 枪类实现
@implementation Gun
-(void)shoot{

    NSLog(@"%@ 正在 突突的射击...",_size);

}
@end


#pragma mark 士兵类声明
@interface Soldier:NSObject
{
    @public
    NSString *_name;
    int life;
    int level;
//    Gun *_gun;
}

//行为
//士兵开火
-(void)fireByGun:(Gun *) gun;
@end
#pragma mark 士兵类实现
@implementation Soldier
-(void)fireByGun:(Gun *) gun{

    //让枪射击
    //gun 不为 null
    [gun shoot];

}
@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //创建一个士兵对象
        Soldier *s = [Soldier new];
        s->_name = @"三多";
        s->life = 98;
        s->level = 2;
        
        //创建枪的对象
        Gun *gun = [Gun new];
        gun->_size = @"小米加步枪";
        gun->_bulletCount = 3;
        
        //士兵开枪
        [s fireByGun:gun];
        [s fireByGun:gun];
        [s fireByGun:gun];
        
    }
    return 0;
}


/*
 
 士兵开枪 枪射击子弹
 
 枪类:
 名称:Gun
 属性:型号(_size),子弹个数(_bulletCount)
 行为:射击
 
 人类
 名称:Soldier
 属性:姓名(_name)    life    level(等级)
 行为:跑 蹲 开枪  跳
 
 
 */


#import <Foundation/Foundation.h>

#pragma mark 枪类声明
@interface Gun:NSObject
{
    //实例变量
@public
    NSString *_size;  //枪的型号
    int _bulletCount; //枪的子弹数
    
}

//行为
-(void)shoot;
@end
#pragma mark 枪类实现
@implementation Gun
-(void)shoot{
    //每射击一次,子弹的个数要-1
    
    if(_bulletCount>0){
   
        _bulletCount --;
    
    NSLog(@"\n%@ 正在 突突的射击...,剩余子弹:%d",_size,_bulletCount);
    }else{
    
        NSLog(@"\n没有子弹还突突个毛线!");
    
    }
}
@end


#pragma mark 士兵类声明
@interface Soldier:NSObject
{
@public
    NSString *_name;
    int life;
    int level;
    //    Gun *_gun;
}

//行为
//士兵开火
-(void)fireByGun:(Gun *) gun;
@end
#pragma mark 士兵类实现
@implementation Soldier
-(void)fireByGun:(Gun *) gun{
    
    //让枪射击
    //gun 不为 null
    [gun shoot];
    
}
@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //创建一个士兵对象
        Soldier *s = [Soldier new];
        s->_name = @"三多";
        s->life = 98;
        s->level = 2;
        
        //创建枪的对象
        Gun *gun = [Gun new];
        gun->_size = @"小米加步枪";
        gun->_bulletCount = 3;
        
        //士兵开枪
        [s fireByGun:gun];
        [s fireByGun:gun];
        [s fireByGun:gun];
        
        [s fireByGun:gun];
        [s fireByGun:gun];
        [s fireByGun:gun];
        
    }
    return 0;
}

/*
 
 士兵开枪 枪射击子弹
 
 枪类:
 名称:Gun
 属性:型号(_size),子弹个数(_bulletCount)
 行为:射击
 
 人类
 名称:Soldier
 属性:姓名(_name)    life    level(等级)
 行为:跑 蹲 开枪  跳
 
 子弹类(弹夹)
 名称:Bullet
 属性:子弹个数,型号(_model)

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


#import <Foundation/Foundation.h>

#pragma mark 子弹类的声明
@interface Bullet:NSObject
{
    @public
    NSString *_size;
    int _bulletCount;
}

@end

#pragma mark 子弹类的实现
@implementation Bullet

@end

#pragma mark 枪类声明
@interface Gun:NSObject
{
    //实例变量
@public
    NSString *_size;  //枪的型号
    
}
//枪的行为
-(void)shoot:(Bullet *) bullet;
@end
#pragma mark 枪类实现
@implementation Gun
//枪射击的方法的实现
-(void)shoot:(Bullet *) bullet{

   //判断子弹数>0
    //子弹对象(弹夹)中的子弹的个数
    if(bullet->_bulletCount>0){
        
        //子弹数-1
        bullet->_bulletCount --;
        NSLog(@"啪啪啪...枪在射击...剩余子弹:%d",bullet->_bulletCount);
        
    }else{
        //如果子弹数<0 提示没子弹了
        NSLog(@"没子弹了,请换子弹");
        
    }
    
}
@end


#pragma mark 士兵类声明
@interface Soldier:NSObject
{
@public
    NSString *_name;
    int life;
    int level;
    //    Gun *_gun;
}

//行为
-(void)fireByGun:(Gun *) gun andBullet:(Bullet *)bullet;
@end
#pragma mark 士兵类实现
@implementation Soldier
-(void)fireByGun:(Gun *) gun andBullet:(Bullet *)bullet{

    //让枪装上子弹,然后射击
    //子弹作为参数传递给射击的方法
    [gun shoot:bullet];


}
@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //创建一个士兵对象
        Soldier *s = [Soldier new];
        s->_name = @"三多";
        s->life = 98;
        s->level = 2;
        
        //创建枪的对象
        Gun *gun = [Gun new];
        gun->_size = @"小米加步枪";

        
        //创建子弹
        Bullet *myBullet = [Bullet new];
        myBullet->_size = @"5mm口径";
        myBullet->_bulletCount = 3;
        
        [s fireByGun:gun andBullet:myBullet];
        [s fireByGun:gun andBullet:myBullet];
        [s fireByGun:gun andBullet:myBullet];
        [s fireByGun:gun andBullet:myBullet];
        
    }
    return 0;
}



黑马程序员——OC视频学习过程6

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------  视频16: 1、为什么要引入import import引入的头文件,...
  • woxingwosu77
  • woxingwosu77
  • 2015年08月20日 15:00
  • 244

黑马程序员_我的Linux基础整理笔记

Linux Linux文件目录和分区 文件目录: /:根目录 /root:存放root用户的相关文件 /home:存放普通用户的相关文件 /bin:存放普通用户的可执行命令 /sbin:...
  • zhengzhongjie1990
  • zhengzhongjie1990
  • 2014年07月05日 17:08
  • 1518

黑马程序员:从零基础到精通的前端学习路线

随着互联网的深入发展,前端开发工程师一跃成为市场上非常抢手的人才。很多同学,包括以前做UI的、Java的、或者对于IT完全零基础的同学都想学习前端。下图是网上流传甚广的一张前端学习思维导图,很多初学者...
  • itcast_cn
  • itcast_cn
  • 2016年07月29日 14:46
  • 5118

黑马程序员学习笔记 Java的三大框架

如果做javaweb开发,spring是一定要学的,现在主流还是ssh,就是strurs+hibernate+spring,其中hibernate是持久层,用来持久化数据库操作的,如果不喜欢可以学点别...
  • Mr_April
  • Mr_April
  • 2015年07月03日 17:12
  • 1535

黑马程序员—黑马的学习环境没有亲身经历的人是很难体会的!!!

文章来源:黑马程序员,黑马论坛     公元2013年1月10号我拖着沉重的行李箱和对未来的憧憬来到了黑马,公元2013年6月7号我怀抱着满满的知识和对老师的不舍离开了黑马。到现在离开黑马也有一个...
  • heima_28
  • heima_28
  • 2014年08月26日 15:16
  • 1412

黑马程序员--Oracle学习_day06

----------  android培训 、java培训、期待与您交流! ---------- 学习目标:1,理解oracle的pl/sql的概念   2,掌握pl/sql编程技术(...
  • xpaibeyond
  • xpaibeyond
  • 2015年01月16日 14:28
  • 202

黑马程序员—怎么去黑马?吃住问题解答

文章来源:黑马程序员,黑马论坛
  • heima_25
  • heima_25
  • 2014年08月24日 13:24
  • 1142

黑马程序员--一个为进入黑马云六的C++屌丝的28个日夜

首先我要告诉大家,我是一个在大学学了三年C++的人,可能你们会问我,学C++不是挺好的?干嘛突然间要重新学习java呢?况且C++以后的发展不也挺好吗?        我应该怎么回答你们呢?这也是我...
  • heima_hb5
  • heima_hb5
  • 2014年08月22日 08:52
  • 2401

黑马程序员--一段给后者的面试总结

文章来源:黑马程序员, 北京之旅,行北京万事,通百姓生活。其实,我也是个农村出来的孩子,大学没毕业就来北京参加“黑马”,毕业之后,还是没有任何的机遇与机会让我能在那里一展雄威,这就是我们这些菜鸟的悲...
  • heima_hb6
  • heima_hb6
  • 2014年08月24日 13:51
  • 525

黑马程序员:Hibernate基础知识

android培训、java培训
  • u012159707
  • u012159707
  • 2013年09月26日 15:42
  • 585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——OC—类和对象的使用
举报原因:
原因补充:

(最多只允许输入30个字)