- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 nsstreams 发送和接收一些数据。我不想让我的代码如此困惑,所以我想知道:
我是否需要保留对 NSStream 的强引用,或者 [NSStream scheduleInRunLoop: forMode:] 创建对它的强引用?
我找不到任何相关文档。我已经尝试过了,它在没有自己的强引用的情况下也能工作。
我希望有人能证实或反驳这一发现。
最佳答案
是的,在 RunLoop 中调度 NSStream 之后,它的引用计数增加了。我认为这段代码足以证明这一点:
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
pointer)。调用释放对象总是意味着 EXC_BAD_ACCESS
...
NSLog(@"Stream retain count E is %ld",
CFGetRetainCount(val.pointerValue));//crash here
关于reference - [NSStream scheduleInRunLoop : forMode:] retain the NSStream? 是否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39876974/
我想使用 nsstreams 发送和接收一些数据。我不想让我的代码如此困惑,所以我想知道: 我是否需要保留对 NSStream 的强引用,或者 [NSStream scheduleInRunLoop:
我面临一个奇怪的问题。 所以我创建了实例并进行了分配,如下所示 var displayLink:CADisplayLink? private func setupDisplayLink () {
我是一名优秀的程序员,十分优秀!