Assign 은 소스의 보유 수를 늘리지 않고 한 객체에서 다른 객체로의 참조를 만든다. 객체가 아닌 primitive type에 대해 적합하다.

if (obj1 != obj2) {
	[obj1 release];
	obj1 = nil;
	obj1 = obj2;
}

Retain 은 한 객체에서 다른 객체로의 참조를 만들고 원본 객체의 유지 수를 늘린다.

if (obj1 != obj2) {
	[obj1 release];
	obj1 = nil;
	obj1 = [obj2 retain];
}

참고 자료