首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[NSStream scheduleInRunLoop: forMode:]是否保留NSStream?

[NSStream scheduleInRunLoop: forMode:]是否保留NSStream?
EN

Stack Overflow用户
提问于 2016-10-05 14:38:59
回答 1查看 343关注 0票数 3

我想使用nsstream发送和接收一些数据。我不想太乱我的代码,所以我想知道:

我需要保留对NSStream的强引用还是NSStream scheduleInRunLoop: forMode:创建对它的强引用?

我找不到这方面的任何文件。我已经试过了,而且没有一个强有力的参考。

我希望有人能证实或反驳这一发现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-03 14:22:38

是的,在调度NSStream在RunLoop之后,它的引用计数会增加。我认为这个代码足以证明这一点:

代码语言:javascript
复制
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));

和控制台输出:

代码语言:javascript
复制
 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的引用数。当原始强引用计数器值为零后,仍然是正的,这就防止了流对象的去分配。

由于对象仍然存在,因此将响应以下代码:

代码语言:javascript
复制
[(__bridge const NSInputStream*)val.pointerValue open];
[(__bridge const NSInputStream*)val.pointerValue close];

但是下一行将导致崩溃--现在流已从NSRunLoop中删除。所有对它的引用都被删除了--剩下的是指向--现在已被释放--对象的指针的值(行为类似于assigned指针)。调用解除分配的对象总是意味着EXC_BAD_ACCESS.

代码语言:javascript
复制
NSLog(@"Stream retain count E is %ld",
CFGetRetainCount(val.pointerValue));//crash here
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39876974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档