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

来源:互联网 发布:谷雨软件下载 编辑:程序博客网 时间:2024/06/05 13:27

 ------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
原创粉丝点击