Saturday, May 12, 2012

An object in Cocoa, but do not use `*`?

Block

via NedraI via CC License

A funny question

Here is the funny question:

Is there any object in Cocoa/Objective-C that is a object but you do not use * to indicate it?

Now, think a few seconds before you read on: is there any such kind of objects?

NO? are you sure about that?

The Answer

The answer is YES! Yeah, there is a such kind of object in Cocoa/Objective-C.

It is the Block object!

Why?

Apple brought Block, a much more common name is Closure. As you can see from the wiki page, it is a non-standard extention to C/C++/Objective-C 2.0

Because it is an extension not only to Objective-C, but also to C/C++, so it has some special treatment.

Because Block has ^

To indicate a piece of code as a Block(or a Closure), it DOES need something like a pointer, but not a normal pointer. It act as a function pointer, but much more powerful.

So Apple introduced ^ as a replacement of * to Block.

In Objective-C ^ == *

As we can see, ^ is also a pointer, so why do we need another * to pointer to a Block?

Sample code

Use it as a method argument

  typedef void (^MyBlock)(void);  - (void)doSomethingWith:(MyBlock)block;    

Use it as a property

  typedef void (^YourBlock)(void);  @property (nonatomic, copy) YourBlock block;    

Use it as a function argument

  typedef void (^HisBlock)(void);  void myfunction(HisBlock block);    

Note that, none of above is using * to indicate a block, because the typedef has already indicated it is an object.


Of course, don’t forget to follow me @TonnyXu and Facebook



Via Tonny Xu http://feedproxy.google.com/~r/tonnyxu/~3/8TGoxRpWNAU/ iPhone Dev

No comments:

Post a Comment