【问题标题】:NSArray* excludedActivities Leaks memory even when using ARC and setting it to nilNSArray* excludeActivities 即使在使用 ARC 并将其设置为 nil 时也会泄漏内存
【发布时间】:2012-11-18 18:00:51
【问题描述】:

我正在尝试使用新的 iOS6 UIActivityViewController,它工作正常,除了内存泄漏工具说每次我尝试显示控制器时 NSArray *excludedActivities 都会泄漏。

请注意,我尝试使用名为 excludeActivities 的 NSArray,然后将 shareShareController.excludedActivityTypes 设置为以后能够将数组设置为 nil(所有代码都在下面注释)但现在我直接设置属性并且仍然存在是泄漏。

- (IBAction)share:(id)sender
{

    //prepare the image
    UIImage *theImage = [self screenShot];

    //The array of activity Items
    NSArray *activityItems = [[NSArray alloc] initWithObjects:theImage, nil];


   //The acitivyViewController
   UIActivityViewController *shareController = [[UIActivityViewController alloc]   initWithActivityItems:activityItems applicationActivities:nil];

//Excluded Actvivity Types
//NSArray *excludedAcitivities = [[NSArray alloc]   initWithObjects:UIActivityTypeAssignToContact,UIActivityTypeCopyToPasteboard,UIActivityTypePostToWeibo, UIActivityTypePrint, nil];

shareController.excludedActivityTypes = [[NSArray alloc] initWithObjects:UIActivityTypeAssignToContact,UIActivityTypeCopyToPasteboard,UIActivityTypePostToWeibo, UIActivityTypePrint, nil];

    //testing fixning the leak of NSArray
    //excludedAcitivities = nil;

    //set the completion handler
    [shareController setCompletionHandler:^(NSString *activityType, BOOL completed) {

        //test hiding the By MunasabaPro lable
        int shareScreen = pageControl.currentPage;
        MainViewController *someController = [viewControllers objectAtIndex:shareScreen];
        someController.byLabel.hidden = YES;
    }];

    [self presentViewController:shareController animated:YES completion:nil];
}

【问题讨论】:

  • 我还看到我在自己的代码中分配给excludedActivityTypes 的数组泄漏。我什至不使用completionHandler,所以这不是问题。我使用的是 iOS 6.0.1。
  • 哼有趣。在将数组分配给execludedActivityTypes 属性后,您是否尝试将数组设置为nil?我试过了,还是漏水。
  • 我没有数组,我正在这样做:activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];。如果我将数组分配给临时变量而不是 excludedActivityTypes,则不会发生泄漏(正如我所期望的那样!)并不是说它应该有任何区别,我没有使用 ARC。
  • 我明白了。在我的情况下,我使用的是 ARC 并且天气泄漏,我使用临时数组,然后将其设置为 nil 或根本不使用数组。问题是 UIViewActivityController 是新的,没有示例代码或在线帮助。

标签: ios memory-leaks nsarray uiactivityviewcontroller


【解决方案1】:

我认为您的完成处理程序中有一个保留周期。看看那个question

__weak id blockShareController = shareController;
[shareController setCompletionHandler:^(NSString *activityType, BOOL completed) {

       //test hiding the By MunasabaPro lable
        int shareScreen = pageControl.currentPage;
        blockShareController.byLabel.hidden = YES;
    }];

【讨论】:

  • 抱歉,我两次使用名称 shareController 让我感到困惑。一次用于 UIActivityViewController,另一个用于 MainViewController 块内。我现在更改了名称,因此在块内 MainViewController 被命名为 someController。
  • viewControllers 是从哪里来的呢?如果这是一个实例变量,那么 self 会被保留,你应该以同样的方式 __weak 它。
  • 整个-(IBAction)share:(id)senderscrollViewController 中,其中viewControllers 是一个属性。而这个viewControllersMainViewController 实例的数组。所以self 这里是scrollViewController 我不认为它被保留在块内因为我猜根本没有使用。我希望我能让你正确。谢谢。
  • 使用viewControllersself->viewControllers 完全相同。所以是的,self 被保留在这里。
  • 好的。我尝试了您对保留周期问题__weak id blockShareController = shareController; [shareController setCompletionHandler:^(NSString *activityType, BOOL completed) 的解决方案,但泄漏仍然存在,并且指向 shareController.excludedActivityTypes = [[NSArray alloc] initWithObjects:UIActivityTypeAssignToContact,UIActivityTypeCopyToPasteboard,UIActivityTypePostToWeibo, UIActivityTypePrint, nil]; 的 75% 和 [self presentViewController:shareController animated:YES completion:nil]; 的 25% 所以它可能是导致泄漏的块而不是数组。
【解决方案2】:

试试这个,这应该可以解决问题(至少对我来说):

NSArray *activityItems = [NSArray arrayWithObjects:textToShare, imageToShare, nil];

__block UIActivityViewController *activityVC =[[UIActivityViewController alloc] 
initWithActivityItems:activityItems applicationActivities:nil];

activityVC.excludedActivityTypes = @[
    UIActivityTypePrint,
    UIActivityTypeAssignToContact
];

[self presentViewController:activityVC animated:YES completion:^{
    activityVC.excludedActivityTypes = nil;
    activityVC = nil;
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2013-11-05
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多