If you use your own getters/setters then these keywords don't have much of a meaning but if you use @property/@synthesize then u need to use the keywords.
Retain: In this case you get and extra object made that is the retain count for that object is increased by 1 for every retain and you need to release it if you are using arc.Retain is used when you don't want the value to be deallocated while it is set on the object.Also retain creates a strong reference,and an object cannot be deallocated until all of its strong references are released.
Copy: Copy is just reverse of retain as it just gives a copy of the object to work on and the actual value changed on copied object wont be reflected back on the real object . One should use a copy accessor when the setter parameter may be mutable but you can't have the internal state of a property changing without warning .
Assign:Assign is generally used for non-object Datatypes.
Non-atomic: Non-atomic offers thread-safety whereas default atomic doesn't but the read/writes of atomic are thread safe it uses an object level lock that ensure serialization of read/writes.Also ,the value returned from the getter or set via the setter is always fully retrieved or set regardless of what other threads are executing concurrently.If you specify strong, copy, or retain and do not specify nonatomic, then in a reference-counted environment, a synthesized get accessor for an object property uses a lock and retains and autoreleases the returned value.