簡體   English   中英

C中的Objective-C塊

[英]Objective-C Blocks in C

在閱讀Apple Docs中的塊概念概述時,我看到以下聲明:

雖然塊可用於純C和C ++,但塊也始終是Objective-C對象。

這怎么可能? 我的意思是純C中的Objective-C對象。我感到很困惑。

這怎么可能? 我的意思是純C中的Objective-C對象。

Matt Gallagher撰寫了一篇很好地解釋塊如何工作的文章 簡而言之,塊被定義為滿足要求成為有效Objective-C對象的結構(例如,結構以isa指針開始)。 這些都不會導致C的問題,並且編譯器知道塊的定義是什么,因此即使編譯普通的舊C,它仍然可以做正確的事情來使塊工作。

塊的添加的Objective-C方面不會影響塊在C中的使用方式,但仍然提供將塊視為對象的能力,以便可以將它們添加到集合中,並像其他任何對象一樣進行管理。

這真的不是那么奇怪。 如果你考慮一下, 所有 Objective-C對象在某種程度上都在C中“可用” - 整個Objective-C運行時由操作表示Objective-C對象和類的結構的C函數組成。 即使不考慮這一點,塊也不是C和Objective-C中可用的數據類型的第一個例子 - 我們已經在Foundation和Core Foundation之間進行了多年的免費橋接 塊的實現可能有些不同,但是讓對象在兩個世界中都起作用並不是一件新鮮事。

Objective-C可以自由地與C混合。只要你的類有一個C API(使用Block_copy,Block_release等進行阻塞),C代碼不關心它是否在Objective-C或C中實現。

從同一份文件中

float (^oneFrom)(float);

oneFrom = ^(float aFloat) {
    float result = aFloat - 1.0;
    return result;
};

oneFrom引用塊(對象)的變量{ float result = aFloat - 1.0; return result; } { float result = aFloat - 1.0; return result; }

塊可用於純C和C ++,即。 該塊可以由純C或C ++代碼組成。

暫無
暫無

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

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