0

Facebook に接続する Xcode 4.6 のアプリケーションがあります。アプリケーションがバックグラウンドに移行してフォアグラウンドに戻るときに、アプリケーションのさまざまなポイントで時折クラッシュが発生することがよくあります。一貫性がなく、クラッシュの分析が困難だったので、計測器を使用してメモリ リークを特定しようとしました。私は iOS にまったく慣れていないので、メモリ リークが発生していることを突き止めることができました。また、どのメソッドがそれらを引き起こしているかを確認することもできましたが、「さてどうしたものか」と考えていることに気づきました。つまり、どこに問題があるかはわかりますが、それを特定することはできません。例を強調すれば、誰かが光を当てることができることを願っています。

**これが私が楽器で見ているものです:

楽器のスクリーンショット

リスト内の最初のリークされたオブジェクトを見るだけです:

漏洩したオブジェクト = 「FB セッション」

責任あるフレーム =

+[FBSession openActiveSessionWithPermissions:allowLoginUI:allowSystemAccount:isRead:defaultAudience:completionHandler:]

これは、このメソッド内にリークされたオブジェクトが存在することを意味すると解釈します。あれは正しいですか?実装されたメソッドは私の App Delegate に存在し、次のようになります。

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
  NSArray *permissions = [[NSArray alloc] initWithObjects:
                        @"user_about_me",
                        @"read_friendlists",
                        nil];
  //IMPLEMENTED METHOD
  return [FBSession openActiveSessionWithReadPermissions:permissions
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,
                                                         FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session
                                                             state:state
                                                             error:error];
                                     }];
}

この時点で、何をする必要があるのか​​ 、またはこの方法がリークを引き起こしている可能性があるのか​​ わかりません。私はメモリリークのチュートリアルを調べましたが、問題を特定するところまでしかたどり着けませんでしたが、解決方法を理解するには至りませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

1

ブロックはそれを保持するため、通常self、ブロックに渡すべきではありません。どうやら FBSession も保持しているcompletionHandlerようで、保持サイクルになっています。

それを壊すには、次の構造のいずれかを使用します。

__weak FBSession *zelf = self; // OK for iOS 5 only
__unsafe_unretained FBSession *zelf = self; // OK for iOS 4.x and up
__block FBSession *zelf = self; // OK if you aren't using ARC

その後

return [FBSession openActiveSessionWithReadPermissions:permissions
                                      allowLoginUI:allowLoginUI
                                 completionHandler:^(FBSession *session,
                                                     FBSessionState state,
                                                     NSError *error) {
                                     [**zelf** sessionStateChanged:session
                                                         state:state
                                                         error:error];
                                 }];

保持サイクルとは何かについてのより完全な説明については、この投稿を参照してください。

于 2013-02-26T18:04:46.137 に答える