delegate property is type of Id so it can store any kind of object in it.
so when you write delegate=self means your delegate contains current class's reference and when you call method using delegate it will call method implemented in current class.
Suppose we have two controller A and B.
Now You create Protocol and delegate property in B and Called some method of Protocol from Class B
suppose method name myMthod()
Now Delegate property of class B has reference of Class A
You have implemented the Protocol method in Class A.
Now If you want to call myMethod from Class A you will write
[self myMethod];
If you call same method using delegate in Class B
[delegate myMethod];
and before this statement delegate=self is execute in Class A so there is no difference between above 2 Statements.
delegate = self // Statement execute in Class A // Delegate Has Class A's ref
now if you Call [delegate myMethod]; or [self myMethod]; both are same.
please refere this link for more details.