Не в состоянии пошутить NSOutputStream's пишут:MaxLength:
У меня есть требование записи пользовательских данных, прежде чем произойдет фактическая запись 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);
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: Я читал, что методы Apple, использующие шипение, не подходят для Appstore, но я также читал случаи, когда они принимаются.
1 ответ
Почему вы считаете, что пьянство - лучший вариант здесь? Звучит как подкласс, было бы намного лучше. Есть несколько хитрых моментов о создании подкласса потока, но посмотрите здесь
Если вы полны решимости заставить Swizzling работать, вы установили контрольные точки и убедились, что ваши Swizzling селекторы не равны нулю? Может случиться, если вы ошиблись в подписи