Swift 2.0 アプリの多くの場所で SMS を送信するための単純なオブジェクト ヘルパーを作成し、次のステップで別のヘルパー (電子メール、PDF オープナーなど) を作成したいと考えています。
私は単純なクラスを作成します:
import Foundation
import MessageUI
class SmsHelper: MFMessageComposeViewControllerDelegate {
func sendSMS(body: String){
if (MFMessageComposeViewController.canSendText()){
let messageVC = MFMessageComposeViewController()
messageVC.body = body
//messageVC.recipients = ["Enter tel-nr"]
messageVC.messageComposeDelegate = self;
AppDelegate().sharedInstance().getTopController().presentViewController(messageVC, animated: false, completion: nil)
}
else{
//do some alert etc.
}
}
func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult){
sendSMSRsp(result, errorMsg: nil)
controller.dismissViewControllerAnimated(true, completion: nil)
print("sms didFinishWithResult")
}
}
私はそれをしたいコードのどこにでも:
class someAnotherClass{
func someFunction(){
let smsHelper = SmsHelper()
smsHelper.sendSms("some text")
}
}
sms iosエディターが開いていますが、閉じたり送信したりしたいときに閉じません。関数をmessageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult)
呼び出したことがないため、メモリリークでアプリがクラッシュします。理由はわかっています。「someFunction」のSmsHelperオブジェクトが終了後に削除されているためです。この関数のスコープ、およびこのオブジェクトは nil であり、システムは nil オブジェクトで didFinishWithResult を呼び出そうとします。私はそれを確認します:「SomeClass」のメンバーとしてsmsHelperオブジェクトを追加すると、機能しました-デリゲートが呼び出されます。
質問は:それを行うためのベストプラクティスは何ですか.メンバーを追加することは私にとってオプションではありません.多くのクラスがそれを使用でき、シングルトンを作成することもできます.appDelegateメンバーはかなりばかげていると思います. スコープ関数の最後でオブジェクトを強制的に削除しないようにする方法は?