Object-C技术学习,更多资源请访问 https://www.itkc8.com
// main.m
// OC反射机制一
//
// Created by Goddog on 15/1/12.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
/*
1.OC提供三种方式与运行环境交互:
(1)直接通过OC的源代码,数据结构负责保存类、类别中定义的数据,而函数则负责处理方法调用。
(2)通过NSObject类中定义的方法进行动态编程。
(3)直接调用运行时函数进行动态编程,运行时系统是一个动态共享库。
2.OC获得Class通常有三种方法:(1)使用Class NSClassFromString(NSString* aClassName)函数来获取Class,该函数
需要传入字符串参数,该字符串参数的值时某个类的类名。
(2)调用某个类的class方法来获取该类对应的Class。
(3)调用某个对象的class方法,该方法是NSObject类中的一个方法,所以所有的OC对象都可以
调用该方法,该方法会返回该对象所属类对应的Class。
3.通过字符串、类名获取的Class对象是相等的。
4.调用Class的alloc方法创建的并不是Class的实例,而是该Class对应的类的实例。
5.程序需要确认一个类的继承关系,判读它是否为某个类的实例货是否为某个类的及其子类的实例直接调用NSObject提供的方法:
(1)isKindOfClass: :该方法需要传入一个Class参数,用于判断该对象是否为该类及其子类的实例。
(2)isMemberOfClass: :该类需要传入一个Class参数,用于判断该对象是否为该类的实例。
(3)conformsToProtocol: :该方法需要传入一个Protocol参数,用于判断该类对象是否为该类及子类的实例,
获取Protocol参数的方式:
<1>@protocol指令,
<2>调用Protocol *NSProtocolFromString(NSString* namestr);
6.isMemberOfClass比isKindOfClass更严格的测试方法。
*/
//
// Man.h
// OC反射机制
//
// Created by Goddog on 15/1/12.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol Man <NSObject>
@end
//
// Girl.h
// OC反射机制
//
// Created by Goddog on 15/1/12.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Man.h"
@interface Girl : NSObject<Man>
@end
//
// Girl.m
// OC反射机制
//
// Created by Goddog on 15/1/12.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import "Girl.h"
@implementation Girl
@end
#import <Foundation/Foundation.h>
#import "Girl.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//通过字符串来获取class
Class classStr = NSClassFromString(@"NSDate");
NSLog(@"%@",classStr);
//直接使用Class来创建对象
id date = [[classStr alloc] init];
NSLog(@"%@",date);
//通过对象来获取Class
NSLog(@"%@",[date class]);
//通过类来获取class
NSLog(@"%d",classStr == NSDate.class);
//实例化对象
Girl* girl = [[Girl alloc] init];
//通过对象来判断该对象的Class
NSLog(@"girl是否为Girl的实例:%d",[girl isMemberOfClass: Girl.class]);
NSLog(@"girl是否为NSObject的实例:%d",[girl isMemberOfClass: NSObject.class]);
//判断类是否为某个类或子类的实例
NSLog(@"girl是否为Girl的实例:%d",[girl isKindOfClass: Girl.class]);
NSLog(@"girl是否为NSObject的实例:%d",[girl isKindOfClass: NSObject.class]);
//判断类是否实现了指定协议
NSLog(@"girl是否实现了该协议:%d",[girl conformsToProtocol:@protocol(Man)]);
}
return 0;
}