copy

A copy mean that you want to guarantee the state of the object. The copy would invoke the copyWithZone: method.

When a mutable object was sent a copyWithZone: message, it will return a clone immutable object, which retainCount is 1. As to an immutable object, it won't copy ,just return the object itself, but the retainCount +1.

block

Why we should specify copy as the property attribute? Because block was a stack object, what's more, the only stack object in Objective-C.

A stack object is just an object where the memory for that object is allocated on the stack. It is more faster and more simpler than Heap object, all of the bookkeeping is done by the compiler when you build your program, and never cause memory leak because it always gets destroyed at the end of the scope where it was declared.

While we specify a copy keywords, a block object(actually it is a struct), will be copied to the Heap, it will gain reference-counting as all objects in Cocoa.