簡體   English   中英

可可,免費電話橋接和ARC

[英]Cocoa, toll-free bridging and ARC

我想做一個簡單的TCP客戶端。 但是我遇到一個錯誤。 當我讓inputStream = (NSInputStream *)readStream; outputStream = (NSOutputStream *)writeStream; 它建議我引入前綴__bridge或_ bridge _transfer。

首先,這是什么? 其次,我嘗試了兩者,但仍然無法發送消息。 我遵循了本教程,並且已經發送了消息並進行了流傳輸。 我安裝了Wireshark,並調用了send消息,但是它沒有向ip發送任何數據包。

我剛剛在這里發布了initNetworkCommunication,因為這是我收到“ bridge”錯誤的地方。

- (void) initNetworkCommunication {

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"54.xxx.xxx.xxx", 1333, &readStream, &writeStream);

    inputStream = (NSInputStream *)readStream;
    outputStream = (NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

}

服務器很好,因為我已經嘗試了示例代碼並且得到了響應。

你能幫助我嗎?

正如H2CO3所提到的,這是一種ARC。

如果您不知道ARC是什么, 請閱讀 總而言之,這是一種自動執行內存管理東西(保留/釋放語句等)的確定性方法,而Objective-C程序員以前必須手動執行這些事情。 這是非常值得使用的,而且缺點少。 但是,它確實有一些陷阱。

ARC在Core Foundation對象上不起作用。 它們仍然受舊規則的約束,您必須自己執行內存管理。 ARC僅適用於Objective-C對象。 但是,某些Core Foundation對象實際上是免費的橋接到其Cocoa等價物。 您正在代碼示例中使用免費電話橋接,以創建CFReadStreamRef ,然后將其作為NSInputStream

所以你會怎么做? 蘋果的文檔說:

如果在Objective-C和Core Foundation風格的對象之間進行強制轉換,則需要使用強制類型轉換(在objc / runtime.h中定義)或Core Foundation風格的宏(在以下示例中定義)告訴編譯器該對象的所有權語義: NSObject.h):

  • __bridge在Objective-C和Core Foundation之間轉移指針,而沒有所有權轉移。
  • __bridge_retainedCFBridgingRetain將Objective-C指針強制轉換為Core Foundation指針,並將所有權轉讓給您。 您負責調用CFRelease或相關函數來放棄對象的所有權。
  • __bridge_transferCFBridgingRelease將非Objective-C指針移動到Objective-C,還將所有權轉移到ARC。 ARC負責放棄對象的所有權。

您正在從Core Foundation轉到Objective-C,因此請忽略第二個要點(這是朝着另一個方向發展)。 問題是您要發生什么—如果在傳輸之后要將該對象交給ARC,僅從Objective-C端使用它,並讓ARC處理內存管理,請使用__bridge_transfer 根據代碼示例,這可能就是您想要的。

如果僅使用__bridge ,或者不使用ARC,則需要使用CFRelease()或通過向其發送release消息來清理對象(后者僅在不使用ARC的情況下有效) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM