Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between blocks in C and Objective C

Here is an excerpt from the Blocks Programming Guide Conceptual Overview section

You can copy a block and even pass it to other threads for deferred execution (or, within its own thread, to a runloop). The compiler and runtime arrange that all variables referenced from the block are preserved for the life of all copies of the block. Although blocks are available to pure C and C++, a block is also always an Objective-C object.

I've been trying to make sense out of that last sentence but have failed to. The first and second part of the sentence seem incompatible to me (I'm probably missing something). Does this mean that blocks are not the same thing in C/C++ and objective C? Is this due to the way block objects in objective C are captured?

like image 248
jbat100 Avatar asked Nov 15 '11 14:11

jbat100


People also ask

What is the difference between C and Objective-C?

Syntactically, Objective-C is an extension of C. So, some portion of Objective-C is exactly the same as C. Your experience of C would help learning such aspect of Objective-C. But the core part of Objective-C programming is made of Object Oriented class system, which you cannot find in C.

What is Objective-C used for?

Objective-C is the primary programming language you use when writing software for OS X and iOS. It's a superset of the C programming language and provides object-oriented capabilities and a dynamic runtime.

Can I use C in Objective-C?

You really can't use C in Objective-C, since Objective-C is C. The term is usually applied when you write code that uses C structures and calls C functions directly, instead of using Objective-C objects and messages.

Is Objective-C still used?

Objective-C is so pervasive in iOS that it's impossible to completely remove it. Apple continues to maintain libraries written in Objective-C, so we should expect Objective-C to be treated as a (mostly) first class language in iOS. At other companies, legacy code remains.


1 Answers

Ok, after some looking around I have found some kind of pointers to answers (no pun intended). The clang block language specification states this about Objective-C Extensions

Objective-C extends the definition of a Block reference type to be that also of id. A variable or expression of Block type may be messaged or used as a parameter wherever an id may be. The converse is also true. Block references may thus appear as properties and are subject to the assign, retain, and copy attribute logic that is reserved for objects.

All Blocks are constructed to be Objective-C objects regardless of whether the Objective-C runtime is operational in the program or not. Blocks using automatic (stack) memory are objects and may be messaged, although they may not be assigned into __weak locations if garbage collection is enabled.

Although I'm still confused as to whether the blocks runtime treats Objective C and C in the same way (creating Objective C objects even if pure C is being compiled) and if apple's proposed extension to C aims to allow using blocks in C/C++ without the creation of Objective C objects. Comments welcome.

like image 139
jbat100 Avatar answered Oct 06 '22 06:10

jbat100