2014-02-20 76 views
0

我已下ARC低於3個代碼測試:的iOS:關於CF對象和目標c對象保留計數

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

2和3是一樣的嗎?或者它是複製粘貼錯誤? – Merlevede

+2

「retainCount」在MRC下幾乎是無用的,甚至在ARC下也是如此。 – Kevin

+0

@凱文是對的。從來沒有看過保留計數。只要做好內存管理。使用靜態分析器進行確認。 – matt

回答

0

docs

__bridge transfers a pointer between Objective-C and Core Foundation with no transfer of ownership.

__bridge_transfer or CFBridgingRelease moves a non-Objective-C pointer to Objective-C and also transfers ownership to ARC.

這意味着,這兩種方法都是有效的。基本上它說的是,如果您使用CFBridgingRelease,則不應使用CFRelease,因爲您轉讓所有權,這就是爲什麼您會看到retainCount有所增加,但正如'Kevin'指出的那樣,ARC沒有任何意義。

關於第二個問題,你的readStream變量可能很強或不強。這裏沒有特別的考慮。

+0

那麼對於使用,首先使用是否正確? –

+0

@趙洛基是的,它是正確的! – Merlevede

+0

#1和#3都是正確的。 #2泄漏,因爲它保留而不釋放。 –