OC第一个思想 类的封装

 一:对象方法和类方法

 对象方法:

    1)'-' 开头

    2)可以访问实例变量

    3)可以调用类方法

    4)可以调用自己和其他对象的方法(调用其他对象方法,要作为参数传递过来)

    5)由对象调用

  类方法:

    1)'+' 开头

    2)不可以访问实例变量

在一个类方法中不能访问实例变量,因为实例变量还没有分配内存,初始化,也可以说还没有实例变量,原因是还没有对象

    3)类方法可以调用其他的类方法

    4)类方法不可以用对象调用

    5)类方法,可以调用对象方法(把对象作为方法参数传递过来

    6)类方法中不可以再调用当前方法(死循环) 

例如Person类调用自己的类方法reach 

+ (void) reach;

{     

[Person reach]; 

}

        [Person reach];      // 死循环

    注意:对象方法和类方法可以同名

 

二:匿名类的使用

1> 匿名类的第一种用法:

Person *p = [Person new];

        //创建一个车的对象

        //显示的使用对象

        Car *car1 = [Car new];

        car1->_color=1;

        //人开车回家

        [p goHome:[Car new]];  //匿名的使用 

Person对象方法goHome传入的参数对象为匿名对象[Car new];

 

2>匿名类的第二种用法

匿名类可以调用方法

         [[Car new] run];

 

3> 匿名类的第二种用法

访问类的成员变量 实际上达不到我想要的效果

        //[Car new]每执行一次,都会分配一块新的存储空间

[Car new]->_color=2;

三:封装

  类的封装:

    只能通过类的对象方法来访问类的成员变量的措施

  类的成员变量提供set和get方法

    set设置类的成员变量,set方法

    @interface Car:NSObject

     {

         //实例变量

         int _lunzi;

         int _color;

     }

     //定义set方法

     -(void)setLunzi:(int)lunzi;

     //定义get方法

     -(int)lunzi;

 

     //set color

     -(void)setColor:(int)color;

     -(int)color;

    @end

 

    @implementation Car

     //定义set方法

     -(void)setLunzi:(int)lunzi{

 

           _lunzi = lunzi;

     }

     //定义get方法

     -(int)lunzi{

 

           return _lunzi;

     }

     

     //set color

     -(void)setColor:(int)color{

 

           _color = color;

     }

     -(int)color{

 

           return _color;

     }

    @end

    书写规范:

     set方法:

    1)对象方法

    2)即然是设置成员变量值,set方法,可以没有返回值

    3)以set+去掉下划线的成员变量名,并且成员变量的首字母要大写

    4)既然要设定成员变量值,就得传过来要设定的值

                        传递过来的值得类型要和要设定的成员变量名一致

                        形参一般是去掉下划线的成员变量名

 

    get获取当前类的成员变量值,get方法 (可以实现懒加载:需要时在加载)

    get方法

    1)对象方法

    2)既然要获取成员变量的值,方法得有返回值

    3)返回值得类型必须要和要返回的成员变量的类型要一致

 

    4)方法名一般是去掉下划线的成员变量名

 

封装的好处:1,不允许外部修改对象属性的值,只能通过对象的方法修改

  2,可以合理的对外部传入的值进行判断其合理性

 

四:成员变量作用域

@public 修饰成员变量在任何地方通过对象都可以访问

@protected 系统默认修饰符   在本类和子类中可以访问

@private 只有本类中才能访问

@package 在同一个框架中可以访问 (其介于共有和私有之间)

在.m文件中定义的变量或者方法都是私有的,外部文件或者子类都不能调用

#import "Person.h"

@implementation Person

int a;

//这个方法也是私有的

-(void)getPassword{

    NSLog(@"获取到人得密码了");

}

-(void)test{

        //self是一个对象

    [self getPassword];

        a = 100;

    NSLog(@"_id = %d,a = %d",_id,a);

}

@end

Person *p = [Person new];

 [p test]; p->a(属性值a和方法test就无法访问)

 注意:子类继承了父类,默认子类具有了父类的所有的方法和成员变量,但不一定子类中可以访问父类的成员变量和方法,情况一:
父类的成员变量是私有的,二:父类的成员变量和方法定义在.m文件中,子类不能访问

 

posted @ 2014-11-01 21:44  _boy  阅读(437)  评论(0编辑  收藏  举报