0

シナリオ、DRY のために、プロトコル MFMailComposeViewControllerDelegate のメソッドを実装するビュー コントローラー (GeneralDelegateForEmailAndSMS など) を作成しました。

// 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]」のようなコードを、以下にリストされている実装コードで記述できます (つまり、 2 番目のコード スニペットの composeDiscountInfo:data)。

これらのクラス メソッド内で、MFMailCompseViewController のデリゲート プロパティ (mailComposeDelegate) を、MFMailComposeViewControllerDelegate を実装するスタンドアロン クラスに設定できればと思います。

メイラーをシングルトンにするかもしれません。呼び出しは、多くの VC で '[MyMailer instance] composeThatMailWith:data' のようになります。明日やってみます!

4

0 に答える 0