我想使用nsstream发送和接收一些数据。我不想太乱我的代码,所以我想知道:
我需要保留对NSStream的强引用还是NSStream scheduleInRunLoop: forMode:创建对它的强引用?
我找不到这方面的任何文件。我已经试过了,而且没有一个强有力的参考。
我希望有人能证实或反驳这一发现。
发布于 2016-12-03 14:22:38
是的,在调度NSStream在RunLoop之后,它的引用计数会增加。我认为这个代码足以证明这一点:
NSInputStream* nStream = [[NSInputStream alloc] initWithFileAtPath:path];
NSLog(@"Stream retain count A is %ld", CFGetRetainCount((__bridge CFTypeRef)nStream));
NSValue* val = [NSNumber valueWithPointer:(__bridge const void * _Nullable)(nStream)];// not increment reference counter
NSLog(@"Stream retain count B is %ld", CFGetRetainCount(val.pointerValue));
[nStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
NSLog(@"Stream retain count C is %ld", CFGetRetainCount(val.pointerValue));
nStream = nil;
NSLog(@"Stream retain count D is %ld", CFGetRetainCount(val.pointerValue));和控制台输出:
Stream retain count A is 1
Stream retain count B is 1
Stream retain count C is 3
Stream retain count D is 2因此,添加到NSRunLoop中会增加2的引用数。当原始强引用计数器值为零后,仍然是正的,这就防止了流对象的去分配。
由于对象仍然存在,因此将响应以下代码:
[(__bridge const NSInputStream*)val.pointerValue open];
[(__bridge const NSInputStream*)val.pointerValue close];但是下一行将导致崩溃--现在流已从NSRunLoop中删除。所有对它的引用都被删除了--剩下的是指向--现在已被释放--对象的指针的值(行为类似于assigned指针)。调用解除分配的对象总是意味着EXC_BAD_ACCESS.
NSLog(@"Stream retain count E is %ld",
CFGetRetainCount(val.pointerValue));//crash herehttps://stackoverflow.com/questions/39876974
复制相似问题