无法调配 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)

无法调配类方法

iOS开发系列-NSOutputStream

通过 NSInputStream 和 NSOutputStream 进行视频流

使用 NSOutputstream 有啥好处?

源码0603-01-了解-大文件下载(NSOutputStream)