0

可能是一个菜鸟问题,但我目前似乎无法正确回答。我正在开发一个应用程序,其中有一个用于确认一些基本事项的操作表。但是,在为该 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");
    }
}
4

1 回答 1

0

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

作为实验,您可以尝试以下任一方法:

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

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


在您发表评论后编辑

属性声明很好,它上面有strong属性。在你的InviteSponsorsFrom类中,尝试添加一个dealloc方法并在那里设置一个断点,以查看对象是否被释放,以及调用来自何处。

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

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

于 2013-06-10T20:45:57.793 回答