关闭

黑马程序员————第十九天

114人阅读 评论(0) 收藏 举报

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

OC中self相当于C++java中的this指针

super发送消息将方法实现分发给其父类


self应用场景

1.用在类方法

2.用在对象方法中

3.访问成员变量

4.self在OC的内存管理特殊使用



self在对象方法中时期只带调用当前方法的对象

@implementation Person

-(void) run

{

}

-(void) eat:(NSString *)foodName

{

[self run];

}

@end




2.self在类方法使其指带当前类


[Person class];

返回的就是的当前类




继承

在子类的文件中需要导入需要继承的头文件


1.子类不能定义和父类同名的实例变量但可继承父类的

OC支持隔层继承

2.集成体系的调用顺序为层层往上找


实例变量作用域

public  任意程序集

protected 同类和派生类

private 同一类


@package (框架级别的)作用域介于私有和公开之间

只要处于用一个框架中就可以直接通过变量名访问


@private  能继承,不能被外部方法访问


类的声明中默认的为@protected




OC中的私有变量

.m文件也可声明成员变量

真正的私有变量只能在当前类使用,不能被继承,也不能访问



在.h中没有声明(.h文件看做是对外的一个接口)

在.m实现此时方法称为私有方法

可用[self 方法名]访问私有方法



description方法

Dog *d=[Dog new];

NSLog(@"%@",d); //打印对象,调用了对象的description方法

打印:<Dog:0x1001002e0>

重写父类的description时千万不要在description方法中同时使用%@和self造成死循环


多态

不同对象以自己的方式响应同名方法的能力


多态条件有继承关系,方法重写

Animals *anl=[Dog new];

[(Dog *)anl eat];

OC运行时加入新的数据类型和新的模块:动态类型识别,动态绑定,动态加载

存在多态,父类可访问子类的方法,否则不可以。



获取类对象

Class c1=[Person class];

Person *p=[c1 new]; //使用类对象创建实例对象[c1 test];调用的是类方法



SEL类型

全称selector 表示方法存储位置


[p test] 寻找方法的过程

1.把test方法名包装成sel类型的数据

2.根据sel数据找到对应的方法地址

3.根据方法地址调用相同的方法

4.注意:在这个操作中的有缓存,第一次一个找一个之后直接使用


每个方法都有_cmd表示当前方法

SEL s1=@selector(test);

[p performSelector:s1];


Person  *p=[Person new];

类对象的存储细节

首先通过p指向额地址找到实例对象,之后通过_isa指针的地址找到person类对象再通过类对象的_isa指针找到Person的代码区空间。之后通过SEL找到需要的方法。












0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2196次
    • 积分:187
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档