Ios 无法swizzle NSOutputStream';s write:MaxLength:
在实际写入NSOutputStream之前,我需要编写一个自定义数据 为了执行swizzling代码,我创建了一个类别NSOutputStream(SwizzleWrite),其中包含以下内容:Ios 无法swizzle NSOutputStream';s write:MaxLength:,ios,swizzling,nsoutputstream,Ios,Swizzling,Nsoutputstream,在实际写入NSOutputStream之前,我需要编写一个自定义数据 为了执行swizzling代码,我创建了一个类别NSOutputStream(SwizzleWrite),其中包含以下内容: SEL originalSelector = @selector(write:maxLength:); SEL swizzledSelector = @selector(swizzledWrite:maxLength:); Method originalMethod = class_getInstan
SEL originalSelector = @selector(write:maxLength:);
SEL swizzledSelector = @selector(swizzledWrite:maxLength:);
Method originalMethod = class_getInstanceMethod([NSOutputStream class], originalSelector);
Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
然后我创建输入输出流:
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault、hostRef、80、&readStream和&writeStream)
但是现在,当控件到达handleEvent:delegate时,特别是在:[outputStream write:rawstring maxLength:sizeof(rawstring)];,我在swizzledWrite:maxLength:
我做错了什么
PS:我已经读到swizzling Apple方法对Appstore不友好,但我也读过它们被接受的案例。为什么你觉得swizzling是这里的最佳选择?在我看来,子类会更好。对流进行子类化有一些棘手的地方,但请看一看
如果您决定让滑动工作,您是否设置了断点并确保滑动选择器不为零?如果您的签名有点错误,可能会发生这种情况哦,也许我看错了您的问题。问题是没有在swizzled函数上调用handleEvent吗?嘿,Yaser,我得到了原始和要使用选择器swizzled的有效引用。我不是在摇晃手机:它是按它应该的方式工作的。问题是当我得到可用的nsstreamventhasspace时,我调用write:maxLength,理想情况下我应该调用swizzled选择器,但我不知道swizzling是否是最好的选择,但子类化不会有帮助,因为我正在处理的代码是作为框架公开的。好吧,我理解你的意思是正确的。你确定只运行一次swizzling代码吗?我在AppDelegate中导入“NSOutputStream+SwizzleWrite.h”,它调用此类的“load”方法。我在load方法上有一个断点。我只控制过一次。
inputStream = (__bridge_transfer NSInputStream *)readStream;
outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];