调用Delegate但释放调用viewcontroller

时间:2013-06-10 20:20:41

标签: objective-c delegates

可能是一个菜鸟问题,但我现在似乎无法做到这一点。我正在开发一个应用程序,我有一个用于确认一些基本内容的动作表。但是,在为该Actionsheet调用委托之后,我的初始调用对象被释放(或不被启动)。

在委托方法中,我想要在该对象上调用一个方法,但它从那时起就没有做任何事情。

在这种情况下,self.inviteSponsorsFromVC不再启动了,我想从中调用saveSponsorWithEmail方法。我不能只重新启动它,因为对象中有一些对象,它必须使用。

如果我只是删除动作表并直接调用saveSponsorWithEmail方法而不使用委托,那么一切正常。

这是我的委托方法:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    //Get the name of the current pressed button
    NSString *buttonTitle = [actionSheet buttonTitleAtIndex:buttonIndex];
    if  ([buttonTitle isEqualToString:NSLocalizedString(@"Send invitation", nil)]) {
        ContactFromAddressBook *contactFromAddressBook = [self.tableData objectAtIndex:selectedIndex.row];
        [self.inviteSponsorsFromVC saveSponsorWithEmail:contactFromAddressBook.email andName:contactFromAddressBook.fullName];        
    }
    if ([buttonTitle isEqualToString:NSLocalizedString(@"Cancel", nil)]) {
        NSLog(@"Cancel pressed --> Cancel ActionSheet");
    }
}

1 个答案:

答案 0 :(得分:0)

我的猜测是,在委托方法中,self.inviteSponsorsFromVC的内容为nil。在Objective-C中,当您向nil发送消息时,消息被忽略(例如,与C ++不同,当您在NULL对象上调用方法时会发生崩溃)。

作为一项实验,您可以尝试以下任何一项:

  • 如果您使用ARC,请将属性self.inviteSponsorsFromVC设为强引用
  • 如果您不使用ARC,请在显示操作表之前的某个时刻说[self.inviteSponsorsFromVC retain]

无论哪种方式,您需要做的是确保在调用其中的方法之前,self.inviteSponsorsFromVC中的对象不会被释放。


您的评论后

编辑

属性声明很好,它上面有strong属性。在InviteSponsorsFrom类中,尝试添加dealloc方法并在那里设置断点以查看对象是否已取消分配,以及调用的来源。

- (void) dealloc
{
  [super dealloc];
}

还要确保首先创建InviteSponsorsFrom的实例。我假设您在该类的某个位置有一个初始化程序,您可以在其中设置断点和/或添加NSLog语句以确保创建该实例。