我是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/