首页 > 其他 > 详细

选择器和继承

时间:2015-04-05 23:10:41      阅读:285      评论:0      收藏:0      [点我收藏+]

【选择器】

一.认识选择器(Selector)

【注】选择器是一个变量类型

SEL

【注】SEL的变量装消息 类似于函数指针

SEL sel = @selector(crash);

[man performSelector:sel];

[man performSelector:@selector(setName:) withObject:@"Tom"];

【注】performSelector:最多支持两个参数

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

#pragma clang diagnostic pop

//在ARC(自动内存管理)的条件下,使用选择器,很可能会报警

//可照如上方式去除报警

SEL sel = @selector(run);

//这个方法用于编译时就能确定调用的方法

SEL sel = NSSelectorFromString(@"run");

//这个方法用于运行时确定调用的方法

二.选择器的作用

【注】1.选择器支持了iOS开发中,控件的事件响应机制。

2.选择器可以另一个方法实现不同功能,增加代码复用度。

3.用于方法的回调。

三.Class

【注】Class也是类型,装类的类型。

Class cls = [Dog class];

//NSObject自带类方法class,将当前类转成Class类型。

Class cls = [Dog class];

id dog = [[cls alloc] init];

//Class变量,也能创建对象。

BOOL ret = [dog isKindOfClass:[Dog class]];

//判断一个对象是否属于一个类

Class cls2 = NSClassFromString(@"Dog");

//Class变量也可以在运行时(runtime)赋值。

【继承】

【注】这里说的继承,指集合的包含关系,即父类和子类的关系

一.认识继承

(一)从生活逻辑的角度

父类  生物      外星人

子类  动物  变形金刚

父类  动物  变形金刚

子类  人类  汽车人

类 人类  汽车人

对象  我  大黄蜂

【注】父子类的各种称呼

父类   parentClass    超类 supperClass   基类

子类   childClass        子类 subClass         派生类

【注】【继承】也可被称作【派生】。父类拥有的属性和方法,子类直接获得,这个过程叫做继承。子类在父类基础上,衍生出了自己独有的属性和方法,称为派生。继承和派生是描述同一事物的两种侧重。

(二)从编写代码的角度

@interface Father : NSObject

{

    int a;

    int b;

    int c;

}

@property NSString * name;

- (void)run;

- (void)jump;

@end

@interface Son : Father

//通过:建立继承关系继承到父类的字段,属性和消息

//但是子类无法继承到父类未声明的方法

//子类也可以派生出自己独有的字段,属性和消息

{

    int d;

}

@propertyNSString * ID;

- (void)swim;

@end

【重写】有时候从父类继承到的方法,并不适合子类,子类可以重写这个方法。

【注】很多时候,子类的方法只需要在父类的同名方法中增补些内容。可以通过关键字【supper】调用父类的方法,再增添子类独有的内容。

//重写父类的jump方法,重写方法,不用声明

//重写的方法会覆盖掉父类的方法

- (void)jump

{

    NSLog(@"I can jump 1.8m!");

}

//很多时候,重写父类的方法,只是在父类的功能上添枝加叶。

- (void)showSelf

{

    //先调用父类的showSelf,再加上自己的功能

    [super showSelf];

    NSLog(@"%@", self.ID);

}

(三)从内存结构的角度

【问】为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却可以。

【再问】为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却可以。

【答】因为OC的动态继承编译机制。所谓动态继承机制,就是说在编译时,不能确立类之间的继承关系,自然无法确定类的大小。只有运行时,才确立类之间的继承关系。不能在编译时确定类的大小,自然不能将类的对象创建在栈里。

二.继承的作用

编写面向对象的程序,核心的手法有三:

继承 封装 多态

(一)(iOS中用的最少)创建大量相似的类

【例】创建象棋中的棋子,车马士象炮。

可以先创建棋子类,作为父类。

(二)(最常用)继承一个官方或第三方类,添加属性和方法,创建一个更符合当前工程的新类。

【注】NSString NSArray NSDictionary 都是【工厂类】不能被继承,即使被继承,也不能使用父类的方法。

(三)(不常用到)用继承方式统一多态接口

【见下一节】

三.多态与类的消息机制

【多态】重载,重写,虚函数

//其实多态就是指,同一个接口不同的实现。

【注】OC的成员方法采用消息机制,因此都是虚函数。

【虚方法】

1.父类的指针,可以指向子类的对象。

2.响应消息,不看指针,看对象。

【注】虚方法体现了不同事物被同一事件触发,有不同的响应。

选择器和继承

原文:http://www.cnblogs.com/MarkBlog/p/4394947.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!