从所有人中删除自己作为代表

时间:2014-12-24 12:34:27

标签: objective-c delegates

有一种方法可以从所有通知中删除自我作为观察者:

[[NSNotificationCenter defaultCenter] removeObserver:self];

是否有类似的方法将self删除为viewController所代表的所有对象的委托?

我想将它放在我的原型dealloc中的viewController方法中。原因是,有时当我解雇viewController时,我会收到一条消息,其中UIScrollView(或任何官方子类)在其委托上调用了一个方法(viewController )此后已被解除分配。由于我有意识地不打电话给这样的方法,我宁愿设置self.delegate = nil。但由于这是一个原型viewController,我没有那些滚动浏览器的插座,因此我的问题。

3 个答案:

答案 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代码。