gpt4 book ai didi

ios - 方法调配不适用于 NSFileHandle 类

转载 作者:行者123 更新时间:2023-11-28 20:24:27 25 4
gpt4 key购买 nike

我有以下代码来进行方法调配:

static inline void swizzleMethod(const char *clsName, const char *mthName, const char *clsName2, const char *mthName2) {
Class cls1 = objc_getClass(clsName);
SEL sel1 = sel_registerName(mthName);

Class cls2 = objc_getClass(clsName2);
SEL sel2 = sel_registerName(mthName2);
Method mth = class_getInstanceMethod(cls2, sel2);
IMP imp = method_getImplementation(mth);
NSLog(@"method type encoding %s", method_getTypeEncoding(mth));

class_replaceMethod(cls1, sel1, imp, method_getTypeEncoding(mth));
}

我的 VGFileHandle 类:

@interface VGFileHandle : NSObject
@end

@implementation VGFileHandle
- (NSData *)readDataToEndOfFile {
NSLog(@"readDataToEndOfFile");
return nil;
}
@end

在 main.m 中,我有以下调用:

int main(int argc, char *argv[])
{
swizzleMethod("NSFileHandle", "readDataToEndOfFile", "VGFileHandle", "readDataToEndOfFile");

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myFile"];

NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:filePath];
NSData *data = [handle readDataToEndOfFile];

@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

按理说,当调用 [handle readDataToEndOfFile] 时,它应该从 VGFileHandle 调用 readDataToEndOfFile 并打印出“readDataToEndOfFile”。但是,在我的测试项目中,方法调配似乎根本没有取代方法实现。 [handle readDataToEndOfFile] 仍然执行原来的实现。

我想知道可能是什么原因。提前致谢。

最佳答案

不看NSFileHandle的实现,就无法下定论。

很可能,这是因为 NSFileHandle 是作为类簇实现的,因此,您实际上没有抽象类、公共(public)类的实例。相反,您有一些私有(private)子类的实例(它可能会因看似随机的、面向实现细节的原因、跨操作系统版本或配置的原因而改变)。

Swizzling 方法是糟糕的代码。私有(private)系统类中的 Swizzling 方法是更糟糕的代码,几乎肯定会导致调试和支持痛苦。

关于ios - 方法调配不适用于 NSFileHandle 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com