我是Objective-C的新手(来自Java背景),如果这个问题过于琐碎,我们深表歉意。

假设我有两个类,其中一个包含对另一个的引用,例如:

@interface PostOffice
@property (nonatomic, strong) MailGuy *mailGuy;
@end

@implementation PostOffice
-(void)getMailmanToSendMail {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        self.mailGuy = [[MailGuy alloc] init];
        [self.mailGuy sendMail];
    }
}
@end


对于MailGuy:

@interface MailGuy () <MFMailComposeViewControllerDelegate>

@end

@implementation MailGuy
-(void)sendMail {
    NSLog(@"send mail");
    [self.viewController presentViewController:mailViewController animated:YES completion:nil];
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    // upon dismissal, how do i get the PostOffice instance to release this MailGuy instance?
}
@end


我如何使PostOffice释放MailGuy?我只知道什么时候应该基于回调免费。但我不想存储对PostOffice的引用?还是我?我从后台线程实例化MailGuy是否重要?

任何帮助,将不胜感激。谢谢!

最佳答案

这样做的通常方法是使用协议和委托。

因此,在您的MailGuy.h中,您应该添加一个协议

@protocol MailGuyDelegate
  - (void) didPostHisLetter;
@end


仍然在.h文件中,但是这次在@interface内,您将添加一个委托引用

@property (weak, nonatomic) id <MailGuyDelegate> delegate;


这将一个委托属性添加到您的MailGuy,并说该委托必须实现给定的协议(具有该方法)。

然后在您的邮递员实施代码中,这就是您要做的

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    if (self.delegate) {
        [self.delegate didPostHisLetter];
    }
}


这告诉他的代表“嘿,我完成了工作”。因此,您现在要做的就是在PostOffice类中实现委托

在您的PostOffice .m文件中,添加一个私有属性

@interface PostOffice() <MailGuyDelegate>
@end


然后,当您调用邮件人员时,将其委托与self相关联。请注意,我删除了异步分派,因为它没有被使用,并且可能引起注释中提到的问题

-(void)getMailmanToSendMail {
        self.mailGuy = [[MailGuy alloc] init];
        self.mailGuy.delegate = self;
        [self.mailGuy sendMail];
}


剩下要做的就是实现协议的方法(仍然在邮局实现中)

- (void) didPostHisLetter {
    self.mailGuy = nil;
}

关于ios - Objective-C如何在ARC代码中释放自己,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25692879/

10-09 14:24