如何修复 UIPopoverController 中呈现的 UIActivityViewController 的内存泄漏
Posted
技术标签:
【中文标题】如何修复 UIPopoverController 中呈现的 UIActivityViewController 的内存泄漏【英文标题】:How to fix memory leak for UIActivityViewController presented in a UIPopoverController 【发布时间】:2013-05-15 09:22:23 【问题描述】:类似于this post 和this one 我正在为我的应用程序中的共享选项创建一个 UIActivityViewController(ARC 已激活)。它是一个通用应用程序,因此我以模态方式为 iPhone/iPod 展示 UIActivityViewController,并在 iPad 的弹出框内展示。 在分析我的应用程序时 Instruments 检测到我的函数中的 NSArray 内存泄漏,用于创建 UIActivityViewController:
MyActivityItemProvider *activityItemProvider = [[MyActivityItemProvider alloc] init];//custom activity item provider
NSArray *items= [NSArray arrayWithObjects:activityItemProvider, nil];
UIActivityViewController *activity = [[UIActivityViewController alloc]
initWithActivityItems:items
applicationActivities:nil];
[activity setExcludedActivityTypes:[NSArray arrayWithObjects:UIActivityTypeAssignToContact,UIActivityTypePrint,UIActivityTypeSaveToCameraRoll,UIActivityTypePostToWeibo, UIActivityTypeMessage,nil]];
使用上述帖子中的答案(__block 和完成来销毁排除的活动项的数组),我设法修复了 iPhone 的泄漏,因为函数 presentViewController 确实提供了完成处理程序。
如何将 UIActivityController 和 excludeActivityTypes 设置为 nil 以防在弹出窗口中显示它? 我发现 UIActivityViewController 提供了一个 completionHandler 属性,但我不知道如何在不创建循环的情况下使用它...
提前致谢!
【问题讨论】:
__block UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; activityController.excludedActivityTypes = [NSArray arrayWithObjects:@"a",@"b", nil]; [self presentViewController:activityController animated:YES completion:^ activityController.excludedActivityTypes=nil; activityController=nil;];
我这样做是为了在 iPhone 上展示 UIActivityViewController,但对于 iPad,我展示的是: - (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item allowedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL )动画...我该怎么做呢?
这对 iphone 有帮助吗?看看这个***.com/questions/13442910/…
是的,确实有帮助(就像我在我的 OP 中所说的那样 :))问题是:如何通过弹出框实现相同的效果?
【参考方案1】:
根据您的要求尝试此代码
__block UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
activityController.excludedActivityTypes = [NSArray arrayWithObjects:@"a",@"b", nil];
[self presentViewController:activityController animated:YES completion:^ activityController.excludedActivityTypes=nil; activityController=nil;];
【讨论】:
抱歉,不能接受,因为这没有回答我的问题。以上是关于如何修复 UIPopoverController 中呈现的 UIActivityViewController 的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIPopoverController 上创建按钮 [关闭]
如何观察 UIPopoverController 何时被解雇?
UIPopoverController,如何改变它的大小呢?