シナリオ、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' のようになります。明日やってみます!