更新解决您的 sn-p:
CreateGroupViewController * cgvc;
cgvc = [[CreateGroupViewController alloc] init];
// We now _own_ cgvc; we are responsible for its memory
cgvc.delegate = self; // cgvc will send us some fun messages
cgvc.delegate = nil; // Not necessary, because:
[cgvc release]; // cgvc no longer exists
唯一有意义的情况是,如果作为委托的对象(称为A)被释放在之前被其委托的对象(称为B)。例如,如果 B 是一个文本字段,则可能会发生这种情况。 A 消失后,文本字段会一直存在,我们不希望 B 尝试向已释放的 A 发送消息:
MyDelegateClass * del = [[MyDelegateClass alloc] init];
myLongLivedObjThatNeedsADelegate.delegate = del;
// Do stuff...
// Release delegate object without setting outlet to nil
[del release];
// ----
// Some time later, in myLongLivedObjectThatNeedsADelegate:
[delegate objShouldDoX:self]; // CRASH! delegate points to
// deallocated instance
如果变量中有对象,并且不再需要该对象,但该变量可能(不小心)稍后会被使用,则在释放对象后将变量设置为nil 是一种安全措施。
演示:
NSString * str1 = [[NSString alloc] init];
NSString * str2 = [[NSString alloc] init];
NSString * str3 = [[NSString alloc] init];
str1 = nil; // We just leaked the object that was at str1;
// there is no way to release it.
[str1 release]; // Does nothing
[str1 length]; // Also does nothing
[str2 release]; // Release the object
[str2 length]; // CRASH! message sent to deallocated instance
[str3 release];
str3 = nil; // A safety measure
[str3 length]; // Does nothing
当您拥有属性和综合设置器时,它会变得更有趣。如果您有房产:
@property (retain) NSString * myString;
你合成了setter,setter看起来像这样:
- (void) setMyString:(NSString *)newString {
[newString retain]; // Take ownership of new object
[myString release]; // Relinquish old object
myString = newString; // Rename new object
}
所以,如果你这样做self.myString = nil;,会发生什么相当于如下:
[self setMyString:nil];
// Inside setMyString: newString is nil
[nil release]; // Does nothing
[myString release]; // Relinquish old object
myString = nil; // Set myString to nil
您会看到综合属性自动为您执行常规的“安全”实践。这就是为什么您可能会看到人们建议将属性设置为 nil。
最后要注意的是,在dealloc 中是否将ivar 设置为nil 并不重要,因为将不再使用该名称。拥有它的对象正在被破坏,因此“安全措施”不适用。因此,在dealloc,您可以轻松释放您的ivars。