您的位置:首页 > 移动开发 > IOS开发

苹果开发 笔记(22)

2015-05-14 09:20 197 查看
今天继续练习,重新去理解一下动态识别的应用。平时我们经常判断一个对象是不是所属的类或者子类 ,可以通过is 的方法去完成。这个是swift提供的一个方法。oc则提供丰富的方式来判断,大部分功能集成在NSObject可见。可以说NSObject 责任非常重。

方法名作用
isMemberOfClass检测是不是某个类
isKindOfClass检测是不是某个类或者所属子类
respondsToSelector检测方法是否存在接受响应
isSubclassOfClass是否所属的子类
performSelector响应相应的方法
下面创建了三个类 分别为Animal(动物) Human(人类) 和Cat(猫) 类

它们的关系是

Cat 继承了Animal类

Human 则不继承Animal






定义相关的类

Animal.h定义

[code]#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void) eat;
@end


实现动物

[code]#import "Animal.h"

@implementation Animal

-(void) eat
{
    NSLog(@"吃食物");
}
@end


实现人类

[code]
#import <Foundation/Foundation.h>
@interface Human : NSObject
//说话
-(void) say;
@end


[code]#import "Human.h"

@implementation Human

-(void) say
{
    NSLog(@"说话");
}
@end


猫类:

[code] #import <Foundation/Foundation.h>
#import "Animal.h"

@interface Cat : Animal

@end


[code]#import "Cat.h"

@implementation Cat

@end


实现代码

[code]#import <Foundation/Foundation.h>
#import "Human.h"
#import "Animal.h"
#import "Cat.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");

        //如何得到类对象
        //1.可以通过类发送class 的消息
        //2.可以通过实例对象 发送class的消息

        //动态识别应用
        Animal *animalA =[[Animal alloc]init];
        Animal *animalB =[[Animal alloc]init];
        Cat *cat =[[Cat alloc]init];

        //判断两个类对象是不是一样?
        if([animalA class]==[animalB class])
        {
            NSLog(@"通过实例对象获得类对象判断是一样的");
        }

        //对象是不是所属类对象成员,判断是不是属于某个类
        if([animalA isMemberOfClass:[Animal class]])
        {
            NSLog(@"判断是所属Animal类");
        }

        //对象是不是所属类对象的成员或者子类的成员,判断是不是属于某个类或者子类,区别于isMemberOfClass方法
        if([animalA isKindOfClass:[Human class]])
        {
            NSLog(@"判断是所属Animal类");
        }
        else
        {
             NSLog(@"判断不是所属Human类");
        }

        //判断是不是某个类的子类
        if([Cat isSubclassOfClass:[Animal class]])
        {
            NSLog(@"Cat是Animal的子类");
        }

        //通过字符串 获取 类对象
        Class myClass = NSClassFromString(@"Animal");
        id animal =[[myClass alloc] init];//实例化对象
        [animal eat];//采用动态类型去发送消息

        //判断是否能响应指定的eat的方法
        if([animal respondsToSelector:@selector(eat)])
        {
            [animal performSelector:@selector(eat)];
        }

    }
    return 0;
}


在学习动态识别应用里面提及关于静态和动态的一些区别。我们常用的NSString、NSArray、NSInteger 发生一些错误等在编译期就能区别开来 这是编译器帮我们做的工作。

关于静态的好处是什么?

关于动态的优点和缺点又是什么?

这些知识,还是要继续区分一下才行。好,继续看书。

引用下面的一些观点

来自于成少雷的教学

1.可以将对象分为动态类型静态类型两种

2.如果不涉及多态,尽量使用静态类型

3.静态类型可耕好的在编译阶段而不是运行阶段指出错误

4.静态类型能够提供程序的可读性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: