2013-02-26 66 views
0

我有一个应用程序在Xcode 4.6连接到Facebook。我注意到,每当应用程序进入后台并返回前台时,应用程序中的各个点偶尔会发生崩溃。由于不一致,崩溃难以分析,所以我尝试使用仪器来识别内存泄漏。我对iOS相当陌生,尽管我能够成功地确定自己确实存在内存泄漏,而且我甚至可以看到哪些方法触发了它们,但我发现自己在思考,“现在呢?”换句话说,我看到问题出在哪里,但我无法辨认出来。我希望如果我突出一个例子,有人可以说出一些光。需要帮助解决内存泄漏一旦它位于使用仪器

**这里是什么,我期待在仪表:

instruments screen shot

只看该列表中的第一个泄露对象:

泄露对象= “FB会话”

责任框架=

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

我inte将此解释为意味着此方法内部存在一些泄漏对象。那是对的吗?该实施方法存在于我的应用程序委托,看起来像:

- (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]; 
            }]; 
} 

在这一点上,我不知道我需要做的,或者是关于这个方法甚至可以导致泄漏。我已经看过内存泄漏教程,但他们只是让我找到问题的位置,但停下来帮我弄清楚如何解决它。任何帮助表示赞赏。

+0

您是否在应用程序中使用自动引用计数? – Liron 2013-02-26 18:02:51

回答

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]; 
           }]; 

对什么保留周期是更完整的解释见this post

+0

非常感谢帮助。 – jac300 2013-02-26 18:23:36