<分区>
我知道 iOS Runtime 很强大,但我有一个问题:我们应该在哪里使用 Runtime?
例如,我发现很多文章都会讨论类和方法调配。我应该在什么情况下使用它?
我也google了一下,发现在越狱开发中应用比较广泛。不过本人是非越狱开发者,请不要越狱~
谢谢!
<分区>
我知道 iOS Runtime 很强大,但我有一个问题:我们应该在哪里使用 Runtime?
例如,我发现很多文章都会讨论类和方法调配。我应该在什么情况下使用它?
我也google了一下,发现在越狱开发中应用比较广泛。不过本人是非越狱开发者,请不要越狱~
谢谢!
最佳答案
这是一个非常笼统的问题。运行时是一个与您的程序链接的库,它实现了 Objective-C 的一部分,因此它可以出现在任何地方。如果您必须询问,请不要使用它。但仅供引用,这里有一些常见用途:
Swizzling 是两个方法标识符的交换,因此它们指向彼此的实现。这两种方法仍然可用。
使用 swizzling 而不是类别来保留方法的原始实现并避免两个类别覆盖相同的方法(结果将是未定义的)是很有用的。
参见 https://stackoverflow.com/a/8636521/412916获取危险列表。
参见 https://stackoverflow.com/a/13646650/412916
关联引用是一种在不更改对象代码的情况下将实例变量添加到对象的方法。当对象被释放时关联引用被自动删除。
反射(reflection)类的属性。例如,在 JSON 和模型的普通类之间进行映射。我猜 Mantle和 Overcoat包装器就是这方面的例子。
您应该阅读 Objective-C Runtime Programming Guide .
这可能是最重要的用途。代码不是我的,我不记得原作者了。
#include <objc/runtime.h>
#import <Foundation/Foundation.h>
@interface A: NSObject
@end
@implementation A
void pileOfPoo(id self, SEL _cmd) {
NSLog(@"💩");
}
+ (BOOL)resolveInstanceMethod: (SEL)name {
if ([NSStringFromSelector(name) isEqualToString: @"💩"]) {
class_addMethod([self class], name, (IMP)pileOfPoo, "v@:");
return YES;
} else return NO;
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
A *a = [[A alloc] init];
SEL aSelector = NSSelectorFromString(@"💩");
[a performSelector: aSelector];
}
return 0;
}
关于iOS 运行时 : Use Case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19314135/
相关文章:
ios - 在 TableView 的自定义单元格上隐式展开可选值
c++ - 在 objective-c ++上运行时,字符串函数C++返回空
ios - 如何在 iOS 10.1.1 中读取电话号码 - Objective C/Swift
ios - 获取重新排序的 UITableViewCells 的顺序
java - OS X 上的 Maven : unable to find java. 语言问题
java - Runtime.getRuntime().exec() 平台独立吗?
ios - 无法将 parentContext 添加到 NSManagedObjectContext,上下文已经有一个协调器