如何解决将子视图中的委托设置为nil
| 可以说我有一个UIViewController。在该UIViewController内部,我有一个UITextView。 在viewDidLoad中,我将UITextView的委托设置为self。这意味着我需要在dealloc中执行textview.delegate = nil吗?这是真的?有人可以用外行术语解释为什么会这样吗? 如果我误解了\“释放UIViewController但未在调用[super dealloc] \之前将子视图委托设置为nil”的概念,那么有人可以给我一个例子吗 一个真实的错误示例:(澄清)CreateGroupViewController * cgvc = [[CreateGroupViewController alloc] init];
cgvc.delegate = self;
UINavigationController * uinc = [[UINavigationController alloc] initWithRootViewController:cgvc];
uinc.navigationBar.tintColor = [UIColor blackColor];
uinc.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:uinc animated:YES];
cgvc.delegate = nil;
[cgvc release];
我的意思是,每次释放对象时最好将委托设置为nil并不正确。在这种情况下,我正在显示ModalViewController。但是,在执行委托之前,我已经使委托为空,因此不会执行。现在,您如何解释呢?
解决方法
是的,这是解决此问题的正确方法。将委托设置为对象后,实际上是将委托分配给该特定对象,并且是在释放对象之前将其设置为nil的理想方式。
, 是的,完成后,应将委托设置为nil。如果在释放对象后尝试在委托对象上调用方法,这可以防止应用程序崩溃。 (请记住,将消息发送到nil对象是完全合法的)。
在使用该委托在类中或在类本身中,将委托设置为nil的更多详细信息。
, 更新解决您的代码段:
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
唯一有意义的情况是,被委托的对象“ 2”在要为其委派的对象“ 3”之前被释放。例如,如果“ 3”是文本字段,则可能会发生这种情况。在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
如果变量中有一个对象,并且不再需要该对象,但是稍后可能会偶然使用该变量,则在释放对象后将变量设置为“ 9”是一种安全措施。
示范:
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;
对于您要合成的设置器,设置器将如下所示:
- (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
的原因。
最后要注意的是,是否在whether17ѭ中将ivar设置为nil
并不重要,因为不再使用该名称。拥有它的对象被销毁,因此“安全措施”不适用。因此,在dealloc
中,您可以放心而不必担心。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。