They both are just typecast zero's. Functionally, there's no difference between them. ie.,
#define NULL ((void*)0)
#define nil ((id)0)
There is a difference, but only to yourself and other humans that read the code, the compiler doesn't care.
One more thing nil is an object value while NULL is a generic pointer value.