Не в состоянии пошутить 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 селекторы не равны нулю? Может случиться, если вы ошиблись в подписи

Другие вопросы по тегам