NSObject的常见方法

代码:

#import <Foundation/Foundation.h>

/******************************
 * Learning协议
 ******************************/
@protocol Learning

- (void)learn;

@end

/******************************
 * Person类
 ******************************/
@interface Person : NSObject
@end

@implementation Person
@end

/******************************
 * Student类
 ******************************/
@interface Student : Person <Learning>
@end

@implementation Student

- (void)learn {
    NSLog(@"Student - learn");
}

@end

/******************************
 * GoodStudent类
 ******************************/
@interface GoodStudent : Student
@end

@implementation GoodStudent

- (void)learn {
    NSLog(@"GoodStudent - learning");
}
@end

void isKindOfClassTest(void);
void isMemberOfClassTest(void);
void conformsToProtocolTest(void);
void instanceResopnsesToSelectorTest(void);
void respondsToSelectorTest(void);

/******************************
 * main函数
 ******************************/
int main(int argc, const char* argv[]) {
    isKindOfClassTest();
    isMemberOfClassTest();
    conformsToProtocolTest();
    instanceResopnsesToSelectorTest();
    respondsToSelectorTest();
    return 0;
}

void isKindOfClassTest(void) {
    Student* student = [[Student alloc] init];

    // 实例方法isKindOfClass:用于判断一个实例是否是某个类或其子类的实例
    NSLog([student isKindOfClass:[Person class]] ? @"YES" : @"NO");
    NSLog([student isKindOfClass:[Student class]] ? @"YES" : @"NO");
    NSLog([student isKindOfClass:[GoodStudent class]] ? @"YES" : @"NO");
}

void isMemberOfClassTest(void) {
    Student* student = [[Student alloc] init];

    // 实例方法isMemberOfClass:用于判断一个实例是否是某个类实例
    NSLog([student isMemberOfClass:[Person class]] ? @"YES" : @"NO");
    NSLog([student isMemberOfClass:[Student class]] ? @"YES" : @"NO");
    NSLog([student isMemberOfClass:[GoodStudent class]] ? @"YES" : @"NO");
}

void conformsToProtocolTest(void) {
    Person* person = [[Person alloc] init];
    Student* student = [[Student alloc] init];
    GoodStudent* goodStudent = [[GoodStudent alloc] init];

    // 实例方法conformsToProtocol:用于判断一个类是否采用了某个协议
    NSLog([person conformsToProtocol:@protocol(Learning)] ? @"YES" : @"NO");
    NSLog([student conformsToProtocol:@protocol(Learning)] ? @"YES" : @"NO");
    NSLog([goodStudent conformsToProtocol:@protocol(Learning)] ? @"YES" : @"NO");
}

void instanceResopnsesToSelectorTest(void) {
    // 类方法instancesRespondToSelector:用于判断一个类的实例是否可以响应给定的消息
    NSLog([Person instancesRespondToSelector:@selector(learn)] ? @"YES" : @"NO");
    NSLog([Student instancesRespondToSelector:@selector(learn)] ? @"YES" : @"NO");
    NSLog([GoodStudent instancesRespondToSelector:@selector(learn)] ? @"YES" : @"NO");
}

void respondsToSelectorTest(void) {
    Person* person = [[Person alloc] init];
    Student* student = [[Student alloc] init];
    GoodStudent* goodStudent = [[GoodStudent alloc] init];

    // 实例方法respondsToSelector:用于判断某个类的实例是否可以响应给定的消息
    NSLog([person respondsToSelector:@selector(learn)] ? @"YES" : @"NO");
    NSLog([student respondsToSelector:@selector(learn)] ? @"YES" : @"NO");
    NSLog([goodStudent respondsToSelector:@selector(learn)] ? @"YES" : @"NO");
}

输出:

YES
YES
NO
NO
YES
NO
NO
YES
YES
NO
YES
YES
NO
YES
YES


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LLRuntime 是 iOS 开发中常用的一个运行时库,可以在运行时动态地获取和修改对象的属性、方法等信息,常用于实现方法交换、动态添加方法等功能。下面是 LLRuntime 的使用方法: 1. 导入 LLRuntime 库 在 Xcode 中,可以使用 CocoaPods 导入 LLRuntime 库,也可以手动导入。手动导入的方式是: 将 LLRuntime 文件夹拖入项目中,勾选“Copy items if needed”。 在 Build Phases 中的 Link Binary With Libraries 中添加 libLLRuntime.a。 2. 使用 LLRuntime 2.1 获取类的信息 获取类的信息可以使用以下方法: ```objc Class cls = [NSObject class]; // 获取类名 const char *name = class_getName(cls); NSLog(@"class name: %s", name); // 获取父类 Class superCls = class_getSuperclass(cls); NSLog(@"super class name: %s", class_getName(superCls)); // 获取实例变量 unsigned int ivarCount; Ivar *ivarList = class_copyIvarList(cls, &ivarCount); for (unsigned int i = 0; i < ivarCount; i++) { Ivar ivar = ivarList[i]; const char *ivarName = ivar_getName(ivar); const char *ivarType = ivar_getTypeEncoding(ivar); NSLog(@"ivar name: %s, type: %s", ivarName, ivarType); } free(ivarList); // 获取属性 unsigned int propertyCount; objc_property_t *propertyList = class_copyPropertyList(cls, &propertyCount); for (unsigned int i = 0; i < propertyCount; i++) { objc_property_t property = propertyList[i]; const char *propertyName = property_getName(property); const char *propertyAttributes = property_getAttributes(property); NSLog(@"property name: %s, attributes: %s", propertyName, propertyAttributes); } free(propertyList); // 获取方法 unsigned int methodCount; Method *methodList = class_copyMethodList(cls, &methodCount); for (unsigned int i = 0; i < methodCount; i++) { Method method = methodList[i]; SEL methodName = method_getName(method); const char *methodType = method_getTypeEncoding(method); NSLog(@"method name: %@, type: %s", NSStringFromSelector(methodName), methodType); } free(methodList); ``` 2.2 方法交换 方法交换可以使用以下方法: ```objc @implementation NSObject (LLRuntime) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class cls = [self class]; SEL originalSEL = @selector(description); SEL swizzledSEL = @selector(ll_description); Method originalMethod = class_getInstanceMethod(cls, originalSEL); Method swizzledMethod = class_getInstanceMethod(cls, swizzledSEL); BOOL didAddMethod = class_addMethod(cls, originalSEL, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(cls, swizzledSEL, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); } - (NSString *)ll_description { NSString *description = [self ll_description]; return [NSString stringWithFormat:@"<%@: %p, desc: %@>", NSStringFromClass([self class]), self, description]; } @end ``` 2.3 动态添加方法 动态添加方法可以使用以下方法: ```objc @implementation NSObject (LLRuntime) - (void)ll_setName:(NSString *)name { objc_setAssociatedObject(self, @selector(ll_name), name, OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSString *)ll_name { return objc_getAssociatedObject(self, _cmd); } + (BOOL)resolveInstanceMethod:(SEL)sel { if (sel == @selector(ll_name)) { class_addMethod([self class], sel, (IMP)ll_name, "@@:"); return YES; } return [super resolveInstanceMethod:sel]; } @end ``` 以上就是 LLRuntime 的使用方法,可以根据实际需求选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值