Weak
weak applies to the delegate object (which has reference counts and
  all the stuff), but weak references don't increase refcount. But once
  the delegate object is deallocated (from anywhere in the code), any
  weak reference to that object is set to nil. This is extremely useful,
  because if you use only strong and weak references, you can't end up
  with an invalid pointer (pointer to an already deallocated object).
Assign
assign is usually used for ints, floats and other non-object types.
  You can of course assign an object reference to such a variable, but
  if the object is deallocated, you will still have a pointer to it's
  memory (which is garbage now, and will hurt you when you use it).
Strong
Strong will keep the object in the heap until it don't point to it
  anymore. In other words " I'am the owner, you cannot dealloc this
  before i'm fine with that same as retain" You use strong only if you
  need to retain the object.
In case of delegation, weak preferred