iOS:关于CF对象和objective-c对象保留计数

时间:2014-02-20 03:34:05

标签: ios objective-c

我在 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 应该是属性吗?

1 个答案:

答案 0 :(得分:0)

来自docs

  

__ bridge在Objective-C和Core Foundation之间传输指针,不转让所有权。

     

__ bridge_transfer或CFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。

这意味着两种方法都有效。基本上它说的是,如果你使用CFBridgingRelease,你不应该使用CFRelease,因为你转移了所有权,这就是你看到retainCount增加的原因,尽管正如'Kevin'所指出的那样,在ARC中那是毫无意义的。

关于第二个问题,您的readStream变量可能很强大。这里没有特别的考虑。