我在 ARC :
下测试了以下3个代码1,readStream.retainCount = 2;
@property(nonatomic, strong) NSInputStream *readStream;
CFReadStreamRef ref = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
[self setReadStream:(__bridge NSInputStream *)(ref)];
CFRelease(ref);
2,readStream.retainCount = 3;
[self setReadStream:(__bridge NSInputStream *)(CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request))];
3,readStream.retainCount = 3;
[self setReadStream:CFBridgingRelease(CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request))];
我的问题是:为什么1与2&3不同?哪种用法是正确的? readStream 应该是强属性吗?
答案 0 :(得分:0)
来自docs:
__ bridge在Objective-C和Core Foundation之间传输指针,不转让所有权。
__ bridge_transfer或CFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。
这意味着两种方法都有效。基本上它说的是,如果你使用CFBridgingRelease
,你不应该使用CFRelease
,因为你转移了所有权,这就是你看到retainCount增加的原因,尽管正如'Kevin'所指出的那样,在ARC中那是毫无意义的。
关于第二个问题,您的readStream
变量可能很强大。这里没有特别的考虑。