OC封装继承和实例化

[Person new] 做了三件事:

    1)申请内存空间

    2)给实例初始化

    3)返回空间首地址

    

    实例变量保存在堆区

 ``指针(对象名)保存在栈区

    对象方法保存在代码区

    调用方法先找到p所指向的堆区的指针—isa然后再找到isa所指向的代码区的方法

 

    对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数来调用

    函数属于整个文件,函数的声明可以在main内部,也可以在main函数外面,除了@interface @end之间

 

    函数:

  1)所以函数都是平行的

  2)函数不存在隶属关系

  3)使用时可以直接掉用

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

 

 @interface @end 不可以嵌套

 在声明时不可以对成员变量初始化

 成员变量和方法不可以用static修饰

 

[Person new]做了三件事:

 1)申请内存空间

 2)给实例变量初始化

 3)返回空间首地址

 

 申请空间在内存的哪个区:

    new的时候申请的空间在空间的堆区

    如果实例变量是基本类型,此时初始化为0.

    如果是字符串类型,则初始化为null

 实例变量又保存在什么地方

    堆区

    p(指针变量名)栈区

 对象方法保存在代码区

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

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

15)类方法:

类方法调用不需要实例

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

 类方法名称和对象方法名称可以相同

 类方法的好处是不需要创建对象,直接通过类名进行访问,不需要在堆区创建任何空间

 类方法中不允许访问实例变量,可以传个参数

 实例方法可以访问实例变量

 对象方法可以调用对象的其它方法

 在类方法中可以调用类的其它方法,可以用self,也可以使用其它类名调用方法方法

 在类方法中也可以调用对象方法,只不过是通过参数把对象传过来或创建一个对象

 类方法不能调用自身(死循环)

 

[[Car alloc] init] 等同于[Car new]

 匿名类作为方法参数使用:

 Person *p = [[Person alloc] init]

 [p gohome:[Car new]];

16)封装:

实例变量只能被当前类的对象方法访问

 set方法的书写规范:

 1)set方法一定是一个对象方法

 2)set方法一定不能有返回值

 3)set方法必须以set开头    

 4)set之后跟的是实例变量去掉下划线,并且首字母大写

 5)set方法一定有参数,而且参数类型和实例变量的类型一致

 6)oc中没有方法重载,oc中方法不能同名

 7)static 定义的变量只能在当前文件中使用

17)self:

self指调用当前方法的对象

  self在当前类方法中指代当前类

  Person *p = [Person new];

  [p class]; //返回当前类

  函数内部可以定义和全局变量同名的变量

  如果同名,局部变量会暂时屏蔽全局变量的作用域(可以用self来区分)

18)继承:

基类的私有属性能被继承,但不能使用

 oc中是单继承

 调用对象方法先查找本类中是否有方法,否则查找父类

 支持多层继承

 变量默认修饰符是@protect

 @private 只能在当前类的对象方法中使用

 .m中定义的变量就是私有变量

 没有在.h中声明的方法是私有方法

 私有方法不能被子类继承

 NSLog("%p", d); 打印对象地址

 NSLog("%@", d); 打印类名+对象地址

 以%@的格式打印对象d,此时调用对象的description方法,如果子类中没有重写description方法则调用父类的

 [d class]; 获取Dog类

 类方法不能访问实例变量

 不要在description方法中使用%@和self会造成死循环

 

posted @ 2015-07-24 19:34  do+better  阅读(229)  评论(0编辑  收藏  举报