1

Similar to this post and this one I'm creating a UIActivityViewController for the sharing option in my app (ARC activated). It's a universal app, so I'm presenting the UIActivityViewController modally for iPhone/iPod and inside a popover for iPad. While profiling my app Instruments detected memory leaks for an NSArray inside my function for creating the 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]];

Using the answer (__block and completion to destroy array for the excluded activity items) from the posts mentioned above, I managed to fix the leak for iPhone since the function presentViewController does provide a completion handler.

How can I set the UIActivityController and it's excludedActivityTypes to nil in case of presenting it in a popover? I found that UIActivityViewController provides a completionHandler property, but I can't wrap my head around how to use it without creating a cycle...

Thanks in advance!

Community
  • 1
  • 1
codingPanda
  • 255
  • 4
  • 13
  • `__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;}];` – Buntylm May 15 '13 at 09:25
  • I did this for presenting the UIActivityViewController on the iPhone, but for iPad I'm presenting it with: - (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated...How am I gonna do that there? – codingPanda May 15 '13 at 09:32
  • what about iphone is this helping for you to remove leaks ? and see this http://stackoverflow.com/questions/13442910/nsarray-excludedactivities-leaks-memory-even-when-using-arc-and-setting-it-to-n – Buntylm May 15 '13 at 09:33
  • Yes that did indeed help (like I said in my OP :) ) The question is: How can I achieve the same with an popover? – codingPanda May 15 '13 at 09:45

1 Answers1

1

As On Your Requirement try this code

__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;}];
Buntylm
  • 7,345
  • 1
  • 31
  • 51