Как устранить потенциальную утечку для подкласса MFMailComposeViewControllerDelegate - PullRequest
0 голосов
/ 26 декабря 2011

Сценарий, ради DRY я создал контроллер представления (например, GeneralDelegateForEmailAndSMS), реализующий методы протокола MFMailComposeViewControllerDelegate.

// GeneralDelegateForEmailAndSMS.h
#import <MessageUI/MessageUI.h>
@interface GeneralDelegateForEmailAndSMS : UIViewController <MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate>
@end

// GeneralDelegateForEmailAndSMS.m
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ ... }

Затем внутри метода класса (например, composeDiscountInfo) класса, отвечающего за рассылку (например, MyMailer)

+(void) composeDiscountInfo:(ResInfoData *)resturantInfo{
    // XmsMFMailComposeViewController, a subclass of MFMailComposeViewController in order to overwrite the default auto rotation.
    XmsMFMailComposeViewController *picker = [[XmsMFMailComposeViewController alloc] init];  

    // Q: method returneds an Object with a +1 retain count.
    picker.mailComposeDelegate = [[GeneralDelegateForEmailAndSMS alloc] init]; 

    // Q: object leaked, allocated object is not referenced later in the execution path and has a retain count of +1  A:
    [picker setSubject:@"title"]; 

    // ... message body construction...  and present via AppDelegate.navController
}

Мой вопрос: какустранить потенциальную утечку памяти (упомянуто выше в комментариях к коду)?Я не могу установить автоматическое освобождение делегата, так как похоже, что он будет собирать мусор и вылетать из приложения.Кроме того, MyMailer должен включать в себя только метод класса, нет методов жизненного цикла для обработки объекта.Какое решение?

Я очень мало знаю об инструкциях профиля, есть ли какие-либо подсказки о том, как использовать их для обнаружения утечек?

Обновлено:

Предполагается, что MyMailer будет классом «только методы класса», во многих контроллерах представления, которые должны составлять / отправлять электронную почту / SMS в приложении, я могу просто написать код типа «[MyMailer composeMailWith: data]» с кодом реализации, указанным ниже (т.е.composeDiscountInfo: данные во втором фрагменте кода).

Внутри этих методов класса я желаю Я могу установить свойство делегата MFMailCompseViewController (mailComposeDelegate) для отдельного класса, который реализует MFMailComposeViewControllerDelegate.

Может быть, я сделаю Mailer одиночным,вызов будет выглядеть как «[экземпляр MyMailer] composeThatMailWith: data» во многих VC.Я попробую завтра!

...