有一种方法可以从所有通知中删除自我作为观察者:
[[NSNotificationCenter defaultCenter] removeObserver:self];
是否有类似的方法将self
删除为viewController
所代表的所有对象的委托?
我想将它放在我的原型dealloc
中的viewController
方法中。原因是,有时当我解雇viewController
时,我会收到一条消息,其中UIScrollView
(或任何官方子类)在其委托上调用了一个方法(viewController
)此后已被解除分配。由于我有意识地不打电话给这样的方法,我宁愿设置self.delegate = nil
。但由于这是一个原型viewController
,我没有那些滚动浏览器的插座,因此我的问题。
答案 0 :(得分:0)
不,没有这样的方法。完成代理后,只需要nil
该引用即可。
在调用任何委托方法之前,请确保检查nil条件以及方法可用性条件,如:
if (_delegate != nil && [self.delegate respondsToSelector:@selector(myDelegateMethod:)]) {
// then only call that delegate method
[self.delegate myDelegateMethod:param];
}
完成所有委托事务后nil
您的参考:
self.delegate = nil;
答案 1 :(得分:0)
我不知道它的任何内置机制。我认为,负责使您的对象成为委托的代码应该负责释放它的责任。您可以为它提供一些界面,但这取决于您的代码。
此外,由于委托是弱引用的,当委托对象被删除时,它们将自动设置为nil,但我认为不是你的情况。
<强>更新强>
因为在你的情况下代理似乎没有被声明为弱,我猜,唯一的选择是跟踪将viewController设置为手动委托的所有对象。
例如:
在ViewController中:
@interface YourViewController
@property (nonatomic, strong) NSMutableDictionary *objectsThatDelegateSomethingToUs;
@end
@implementation YourViewController
-(void)makeDelegateOfObject:(id)obj withDelegatePropertyName:(NSString*)delegatePropertyName {
[self.objectsThatDelegateSomethingToUs setObject:delegatePropertyName forKey:obj];
}
-(void)dealloc {
for (id obj in self.objectsThatDelegateSomethingToUs.allKeys) {
[obj setValue:nil forKey:[self.objectsThatDelegateSomethingToUs valueForKey:obj]];
}
}
@end
将viewController设置为委托的地方:
scrollView.delegate = viewController;
[viewController makeDelegateOfObject:scrollView withDelegatePropertyName:@"delegate"];
但遗憾的是,在这种情况下,您必须以编程方式将ViewController设置为委托。如果委托属性总是被称为delegate
,那么NSMutableArray就应该这样做。
实际上,当它的父ViewController被释放时,scrollView一直工作是很奇怪的。可能这是真正的问题,它可以以某种方式修复,但不幸的是,我现在无法给你任何建议,所以我的答案是试图处理你最初问的问题。我建议你暂时搁置这个问题,也许其他人可以提出更好的解决方案。
P.S。查看Logan对您的问题的评论。如果所有使用ViewController作为其委托的对象都是ViewControllers视图层次结构的一部分,那么他的解决方案就更简单,更优雅。
答案 2 :(得分:0)
将此代码放在我的超类“dealloc
方法中解决了我的崩溃问题:
for (id view in self.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
[view setDelegate:nil];
}
}
我正在考虑在viewController
我可以直接访问UIScrollView
的情况下执行此操作。但是,因为ARC不允许调用[super dealloc]
,所以这不允许调用我的超类中的dealloc
代码。