Property for block
@property(nonatomic, copy) SomeBlockType obj;
If an object is a block object, it’s property should be copy. Because when blocks are created, they live on the stack. When a copy is performed, the block is copied to the heap.
Blocks are placed on the stack by default, not on the heap. The reason is speed. In the common case where the lifttime of the block is less than that of the stack function that contains it, this is a very good optimisation.
The implication of stach blocks being allocated on the stack, is that a stack block cann’t simply be retained - it will become invalid once the function that contains it popped from the stack. If you invoke retain on a stack block, it will have no effect(the retain count of the block will remain at 1).
For this reason, if you need to return a block from a function or method, you must [[block copy] autorelease] it , not simply [[block retain]autorelease] it
Macro
__IPHONE_OS_VERSION_MAX_ALLOWED (SDK VERSION)
__IPHONE_OS_VERSION_MIN_REQUIRED (minimum deployment target)