如何修复 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 何时被解雇?

UIPopoverController,如何改变它的大小呢?

如何删除 UIPopoverController 中的“模糊”阴影

如何使 UIPopoverController 自动改变其箭头方向