无法调配 NSOutputStream 的 write:MaxLength:
Posted
技术标签:
【中文标题】无法调配 NSOutputStream 的 write:MaxLength:【英文标题】:Not able to swizzle NSOutputStream's write:MaxLength: 【发布时间】:2015-01-27 18:39:39 【问题描述】:在实际写入 NSOutputStream 之前,我需要编写自定义数据。
为了让 swizzling 代码执行,我创建了一个类别 NSOutputStream(SwizzleWrite),它包含以下内容:
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);
然后我创建 Inout & Output 流: CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, 80, &readStream, &writeStream);
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];
但是现在当控件到达handleEvent:delegate,特别是在:[outputStream write:rawstring maxLength:sizeof(rawstring)];时,我没有在swizzledWrite:maxLength:
我在这里做错了什么?
PS:我已经读到了 swizzling Apple 方法对 Appstore 不友好,但我也读过它们被接受的案例。
【问题讨论】:
【参考方案1】:为什么您认为 swizzling 是这里的最佳选择?在我看来,子类会好得多。关于子类化流有一些棘手的部分,但请看here
如果你决定让 swizzling 工作,你是否设置了断点并确保你的 swizzling 选择器不为零?如果您的签名有点错误,可能会发生
【讨论】:
哦,也许我读错了你的问题。是不是在你的 swizzled 函数上没有调用 handleEvent 的问题? 嘿 Yaser,我得到了原始选择器和待混用选择器的有效参考。我不是在调整handleEvent:它正在按应有的方式工作。问题是当我得到 NSStreamEventHasSpaceAvailable 时,我调用 write:maxLength,理想情况下我应该在 swizzled 选择器上调用,但我没有。 另外,我不知道 swizzling 是否是这里的最佳选择,但子类化无济于事,因为我正在处理的代码是作为框架公开的。 好的,所以我理解你是正确的。你确定你只运行一次 swizzling 代码吗? 我在 AppDelegate 中执行 #import "NSOutputStream+SwizzleWrite.h",它调用了此类的“加载”方法。我在加载方法上有一个断点。我只获得一次控制权。以上是关于无法调配 NSOutputStream 的 write:MaxLength:的主要内容,如果未能解决你的问题,请参考以下文章
写入后 NSOutputStream 因访问错误而崩溃(Objective-c)