Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法swizzle NSOutputStream';s write:MaxLength:_Ios_Swizzling_Nsoutputstream - Fatal编程技术网

Ios 无法swizzle NSOutputStream';s write:MaxLength:

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

在实际写入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);
然后我创建输入输出流: 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];