[英]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.