黑马程序员------OC 对象和类

 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 1.类和对象的概念

        类; 类是多个相同事物的集合(抽象)

        对象:具体事物也可以指抽象的事物

 

2.类和对象的关系

          1)类的名称:类名

            类的属性:一组包含数据的属性

            类的方法;允许对象属性中包含的数据进行操作方法

          2对象

            是系统中基本的运行实体

            对象就是类类型的变量

            定义了一个类,就可以创建多个对象

            一个类就是具有相同类型的对象的抽象

 

 2.类的定义分两部分

            1)类的声明(规定当前类的:类名、属性行为)

            @interface 类名:父类名

            {

                //定义类的属性

            }

            @end

            2)类的实现 (实现具体行为)

            @implementation 类名

                //行为的具体实现

            @end

           .创建对象访问成员变量

            oc中的创建

            [Car new]; 做了3件事

                1)项计算机申请内存空间

                2)给类的每一个成员初始化

                3)返回新申请的空间首地址

            Car *p =[Car new];

        理解:定义了一个 Car 类型指针变量,指针变量指向了新申请的空间内存

        理解2:实列定义了一个Car 类的对象P

            Car *p = [Car new];

  3.无参数方法的声明及实现

          - (void)方法名;

 #import <Foundation/Foundation.h>
        //车类的声明
        @interface Car:NSObject
        {   @public
        //类的属性
        int wheel;
        NSString *Name;
        int speed;
        
        }
        //类的行为,只能写在{}外面
        //跑的方法 方法名 run
        - (void)run; //定义一个无参数无返回值的方法
        - (void)stop;
        @end
        //类的实现
        @implementation Car
        //run方法的实现
        - (void)run{
        
        NSLog(@"车子跑在了乡间小路上");
        }//stop方法的实现
        - (void)stop{
        NSLog(@"咯吱,车子停了");
        }
        //行为的具体描述
        @end
        int main(int argc, const char * argv[]) {
        @autoreleasepool {
        
        //创建车的类
        //创建了一个Car 对象car1
        Car * car1 = [Car new];
        //创建一类对象的实质还是指针(用指针间接访问实例变量)
        car1 ->wheel = 4;
        car1->Name = @"奥迪";
        car1->speed = 200;
        //查看车子的信息
        NSLog(@"轮子的个数%d,车子的名字%@,车子的速度%d",car1->wheel,car1->Name,car1->speed);
        //方法的调用
        [car1 run];
        //stop方法的调用  向car1对象发送stop消息
        [car1 stop];
        }
        return 0;
        }

  4.oc中的方法分类: 对象方法和类方法

            对象方法

            1)对象方法以-号开头如 -voidxx

            2)对象方法中可以访问当前对象的成员变量

            3)对象方法只能有对象来调用

            4)格式调用[对象名 对象方法]

            类方法

            1)类方法以+开头 +voidXXX

                2)类方法只能有类调用

            3)类方法不能访问实列变量,应为类方法由类调用,并没有创建存储空间来存储类中的成员变量。

            4)调用格式;[类名 类方法名]

            5)类方法的好处和使用场合

            不依赖与对象,执行效率高,能用类方法解决的问题尽量使用类方法;

            场合:当不需要使用到成员变量时,可以改为类方法

  5.有参数方法的声明实现及调用

            带参数的方法的定义和是实现

            声明

         - (返回值类型)sumOfNum1:(参数类型)Num1 andNum2:(参数类型)Num2

          -intsum:(int) x and: (int)y

            有参数方法的使用注意:

                方法的类型 (—)对象方法

                方法的返回值 :int 类型

                方法的参数是; y

                参数的类型 第一个int 第二个 int            

                方法 名  sum: and: (注意冒号也是方法名的)

 

  4.oc中的方法分类: 对象方法和类方法

            对象方法

            1)对象方法以-号开头如 -voidxx

            2)对象方法中可以访问当前对象的成员变量

            3)对象方法只能有对象来调用

            4)格式调用[对象名 对象方法]

            类方法

            1)类方法以+开头 +voidXXX

                2)类方法只能有类调用

            3)类方法不能访问实列变量,应为类方法由类调用,并没有创建存储空间来存储类中的成员变量。

            4)调用格式;[类名 类方法名]

            5)类方法的好处和使用场合

            不依赖与对象,执行效率高,能用类方法解决的问题尽量使用类方法;

            场合:当不需要使用到成员变量时,可以改为类方法

#import <Foundation/Foundation.h>
        typedef  enum IphoneColor {KcolorWhite,KcolorBlack,KcolrTHJ} Color;
        //手机类的声明
        @interface Iphone :NSObject
        {   @public
        //成员变量
        Color _color;//手机的颜色
        int _size; //手机的大小
        int _cpu; //手机的cpu
        }
        //查看本机信息声明
        - (void)aboutMyPhone;
        //打电话 需要参数 电话号码 给谁打电话
        - (void)call:(NSString*)name andNum :(NSString*)num;
        // 发短信  参数 号码 内容
        - (void)sendMessage:(NSString*)num andMessage:(NSString*)neirong;
        
        @end
        //手机类的实现
        @implementation Iphone
        - (void)aboutMyPhone{
        NSLog(@"手机的颜色:%d,大小:%d cpu%d :",_color,_size,_cpu);
        }
        - (void)call:(NSString*)name andNum :(NSString*)num{
        NSLog(@"给%@打电话说%@",name,num);
        
        }
        - (void)sendMessage:(NSString*)num andMessage:(NSString*)neirong{
        NSLog(@"给%@发短信内容%@",num,neirong);
        }
        @end
        
        int main(int argc, const char * argv[]) {
        @autoreleasepool {
        //创建对象
        Iphone *iphone7plus = [Iphone new];
        //设置手机的信息
        iphone7plus->_color =KcolorBlack;
        iphone7plus->_cpu =8;
        iphone7plus->_size= 9;
        //查看手机的信息
        [iphone7plus aboutMyPhone];
        //给1300发短信
        [iphone7plus call:@"1300" andNum:@"你在干嘛"];
        //给10086打电话
        [iphone7plus  sendMessage:@"10086" andMessage:@"你好!请问联通的电话号码是多少?"];
        
        
        
        }
        return 0;

  6.对象的存储细节

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

            [person new]做了3件事;

        1)申请内存空间

        2)给实例变量初始化

        3)返回空间首地址

        

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

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

             当new的时候内存的布局是什么样子。

             初始化的时候 如果变量是基本数据类型,此时给初始化为如果是oc字符串类型 为 null

            2.实例变量保存在 什么区? 堆区 p(指针变量)存放在栈区

            3.对象方法保存在什么地方? 代码区

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

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

                一个累可以创建多个对象

  7.#pragma mark指令的使用

        功能:对代码分组 ,方便查找代码和导航用的

        

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

          1)对象方法的实现只能写在@inplementation。。@end之间,对象方法的声明只能写在@interface。。@end中间

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

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

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

          5)对象方法归对象所有

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

            2)函数不存在隶属关系 

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

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

 9常见的错误

         1@intrfance @end @implementation @end 不能嵌套

         2)写@end

        3)两个成员变量之间对象的声明顺序(可以吧顺序打乱);

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

        5)方法声明写在了{}

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

        7)方法无法像函数那样调用

        8)成员变量和方法不能用static等关键字修饰,

        9)类的实现可以写在mian函数的后面,在使用之前只要声明就可以了。

        出错调试

        @try{ //语法上检查没有问题,运行时错误的

                    //有可能会出错的代码

        }

        @cath(NSException *exception){

            //错误的处理方法

            NSlog(@"%@",exception);

        

        }

        @finally{

        

        }

10 对象和方法之间的关系

        对象作为方法的参数

        -voiddispPerson:(Person*)person;

                Person *p1 = [Person new];

                [p disPerson:p1]//对象作为方法参数

  #import <Foundation/Foundation.h>
        typedef enum Ksex{KsexWomen,Ksexman,Ksexyao}Sex;
        //人类的声明
        @interface Person :NSObject
        {   @public
        NSString *_name;
        Sex _sex;
        }
        //对象作为方法参数声明
        - (void)dispPerson:(Person *)person;
        //对象作为方法的返回值声明
        -(Person*)chengSex:(Person*)person;
        
        @end
        //人类的实现
        @implementation Person
        //显示人物性别
        - (void)dispPerson:(Person *)person{
        NSLog(@"姓名:%@ 性别%d",_name,_sex);
        }
        //修改人物性别的方法实现
        -(Person*)chengSex:(Person*)person{
        person->_sex = Ksexman;
        return person;
        }


 

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

         实现士兵开枪射击子弹 ,弹夹 。

        下面代码是让弹夹对象作为参数先传递到士兵再传递到枪

 #import <Foundation/Foundation.h>
        //子弹夹的声明
        @interface Bullet :NSObject
        {   @public
        int _bulletCount;//子弹数
        NSString *_model;//型号
        }
        @end
        //子弹夹的实现
        @implementation Bullet
        @end
        
        //枪类的声明
        @interface Gun :NSObject
        {   @public
        NSString*_size;//枪的行号
        
        }
        - (void)shoot:(Bullet*)bullet;
        @end
        //枪类的实现
        @implementation Gun
        
        - (void)shoot:(Bullet *)bullet{
        
        //判断每子弹是不是大于0
        if((bullet->_bulletCount--) >0){
        NSLog(@"正在突突的射击,还剩子弹数%d",bullet->_bulletCount);
        }else{
        NSLog(@"没有子弹了,请换弹夹");
        }
        }
        @end
        //士兵的声明
        @interface Soldier : NSObject
        {   @public
        NSString *_name;//姓名
        int life ;//生命值
        int level;//等级
        }
        
        - (void)fireByGun:(Gun*)gun andBllet:(Bullet*)bullet;
        
        @end
        //士兵的实现
        @implementation Soldier
        //射击方法 。需要枪 和弹夹 让枪装上子弹
        - (void)fireByGun:(Gun*)gun andBllet:(Bullet*)bullet{
        //让枪射击
        [gun shoot:(Bullet*)bullet];
        
        }
        @end
        
        int main(int argc, const char * argv[]) {
        @autoreleasepool {
        //创建对象士兵
        Soldier *s1=[Soldier new];
        s1->level =3;
        s1->life =99;
        s1->_name=@"小米";
        //创建对象枪
        Gun *gu = [Gun new];
        gu->_size =@"55mm";
        //创建对象子弹佳
        Bullet *bu =[Bullet new];
        bu->_bulletCount = 3;
        //士兵射击
        [s1 fireByGun:gu andBllet:bu];
        [s1 fireByGun:gu andBllet:bu];
        [s1 fireByGun:gu andBllet:bu];
        }
        return 0;
        }

 

 12.NSString类的介绍使用

        NSString oc中字符窜处理的类

        1创建字符串

        NSString *s =@"banzhang jiecao diaole";

        2输出一个字符串

        NSLog(@"%@",s);

        3.NSString 是一个类

         NSString *s1 =[NSString new];

          s1 = @"zhoujielun";

        4.创建字符串的第三种方式

        //格式化创建字符串(按照指定的格式创建字符串)

        for(int i=1;i<10;i++){

            NSString *imgName = [NSStringWhithFormat: @"xxxxxxxx%02d.jpg",i]

            NSLog(@"%@",imgNam);

        }

        5用一个已经存在的字符串创建一个新的字符串

        NSString *s2 ={[NSSring alloc] initWithString:s1];

            NSLog(@"s2=%@",s2);

 13,计算NSString 字符串的长度 

        1)字符串是纯英文的

        NSString *s1=@"ban";

        int len = [s1 length];

        NSLog(@"len=%d",len);//3

        2)字符串是中文的 oc字符串中英文都死一个字节

        NSString *s2 =@"班长节操";

        len =[s2 length];

        NSLog(@"len=%d",len);//4

        3)中英文混合也是一样都是 汉字1个字节。

  14.类方法

        类方法 :+开头(定义的过程和对象方法一致,只不过开头是+)

        类方法的调用: [类名 方法名]

        类方法的注意事项 :

         1)类方法可以和实例方法同名 ,不影响使用

         2类方法也可以是从父类继承而来,子类可以重写类方法,如description方法就可以在子类重新定义

         3类方法和实例一样在interface里面声明 在implementation里实现

         4)类方法只能被向类发送类方法消息才被执行,向实例对象发送不能执行

         5)类方法里使用了self 这个self执行的类对象calss object 而不是实列对象 instance object

15类方法的疑犯错误

        1.类方法的优点

           1)节省空间

           2)提高了效率

           3)作为工具方法

        错误

        1在类方法中不能用类成员,不能访问实例变量

        2 在实例方法宏 可以使用类的成员变量

        

        对象方法中可以调用其他的兑现该方法

          1)当前对象方法中创建对象,使用新创建的对象调用对象方法

          2)可以使用slef

          3)对象作为方法参数传递过了,可以使用哪个传递过来的对象调用对象方法

        在类方法中中可以调用其他类的方法

            1)可以直接使用本类类名(或者其他类名)调用类方法

            2)可以使用self

            3)对象作为方法参数传递过来

            4)可以创建一个对象

            5)类方法可以调用其他类方法不能调用自身

 16类方法的应用场景

        如果我们调用一个方法,该方法不需要使用成员变量,那么我们可以将该方法声明为类方法

 17 匿名类 (匿名对象)

        匿名对类的第一种使用方法

        1.匿名类访问实例变量(只能访问一次),以后访问,实际是访问新的空间

        2匿名使用类可以调用方法 使用 [[[Car alloc] init] stop] 使用alloc init 调用stop方法

      1.匿名类作为方法参数

         - (void)gHome:(Car*)car{

            //人开车回家,实质是车在跑

        [Car start]

        }

        匿名类调用方法,参数又是匿名类

            [[Person new] goHome:[Car new]];

        */

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值