@Blakeasd As you now know, properties have (or should have) different behaviours, determined by the property's attributes.
For retain and copy properties, in dealloc, [prop release] and self.prop = nil are equivalent (sort of, more later). This is because, as Madd the Sane pointed out, a side-effect of assigning nil to a property is that the previously assigned object will be sent release.
For assign properties, in dealloc, [prop release] and self.prop = nil are not equivalent. This is because the property is declared to simply assign the pointer and to neither send release to the old object nor retain/copy to the new object.
But for assign properties, it would be dubious to send release. The implied semantics of an assign property is that the relationship is not that of ownership, but of association. Because there's no ownership, no release should be sent.
So why the two styles? There are pros and cons for each, of course, otherwise we'd all do the same.
An advantage of assigning nil via properties is that you can consistently assign nil to all your properties and get the correct memory-management. Retain and copy properties will be correctly released, and assign properties will simply be nilled.
The disadvantage of assigning nil via properties is that there's potential for a lot to happen when setting a property. By the time an object is sent dealloc by the runtime, it is in a potentially semi-dead state. Now consider what else can happen when a property is set. If there are any other objects observing this object, they will be notified of the property change. This causes outside code to be called and that is to be avoided in dealloc. Why? The outside code might send messages to this partially dealloc'ed object. It might retain the object, causing the partially dealloc'ed object it to resurrected.
By the way, I haven't talked about undeclared properties. Undeclared properties (the major of Cocoa) doesn't have @property but simply declares the getter and setter messages. You have to read the class reference to determine if it is equivalent to an assign, retain or copy declared property. Sometimes this information is in the setter, sometimes it's in the getter, sometimes it's in description at the start of the class reference.