2011-11-22 143 views
0

我張貼到用戶的Facebook牆上用類似這樣的代碼:取消委託調用後返回FB和委託已dealloc'd

[appDelegate.facebook requestWithGraphPath:@"me/feed" 
       andParams:params 
      andHttpMethod:@"POST" 
      andDelegate:self]; 

如果我解僱託管的UIViewController請求完成之前,我當請求確實完成,因爲委託已被解除分配時,會發生崩潰。

有問題的一個很好的說明,我這裏面臨:https://github.com/facebook/facebook-ios-sdk/issues/220

- (void)dealloc { 
appDelegate.facebook.sessionDelegate = nil; 
[super dealloc]; 

}

這不起作用!

回答

0

我有一個解決方案,但不是很方便;

我在同一個視圖控制器中有兩個單獨的視圖,其中一個是您請求發佈另一個視圖的目標視圖。

當請求完成時,您只隱藏其中一個視圖。或者隱藏另一個並在請求時顯示。

例如,如果你在登錄後到另一個頁面:

- (void)fbDidLogin { 
// Do necessary stuff 
      self.secondView.hidden = YES; 
      self.view.hidden = NO; 
} 

的想法是這樣的,它的工作原理,但不是很方便。

+0

這是否解決了在請求尚未完成時解除分配視圖的問題? –

+0

由於在應用程序退出前,您的rootView或mainView中的視圖沒有被釋放,所以這裏的釋放沒有問題。 –

0

創建一個對象(與視圖控制器分開),該對象將成爲FB委託並且不會釋放該對象。你可以在實例化調用FB的視圖控制器的同一地方實例化它。 或者,如果您不關心退貨狀態,請不要使用委託。

0

如果你看看Facebook自己的代碼如何在Facebook.m中處理這個問題,他們創建一個列表來保存_request對象的'NSMutableSet * _requests''

這是alloc/init'd &在您打電話時添加的請求,然後在清理時刪除它們。 看到'[_requests addObject:_request];'並期待在dealloc中,你會看到: -

for (FBRequest* _request in _requests) 
{ 
_request.delegate = nil; 
[_request removeObserver:self forKeyPath:requestFinishedKeyPath]; 
} 

我用我自己的FB代碼這種方法無代表&它停止退出時,同時請求是活躍的,我具有崩潰。

0

我做了什麼來克服這個問題是爲FB創建一個包裝類,我稱之爲「FacebookManager」。它是一個負責在你的應用程序中完成的每個FB請求的單例。作爲單一應用程序範圍,它的生命週期也持續了整個應用程序的生命。

@protocol 
@optional 
-(void)fbDidLogin; 
-(void)fbDidNotLogin:(BOOL)cancelled; 
-(void)fbDidExtendToken:(NSString *)accessToken expiresAt:(NSDate *)expiresAt; 
-(void)fbDidLogout; 
-(void)fbSessionInvalidated; 
-(void)request:(FBRequest *)request didLoad:(id)result; 

@end 

@interface FacebookManager : Facebook <FBSessionDelegate, FBRequestDelegate> 

+(FacebookManager *)sharedFacebookInstance; 
-(void)setFacebookDelegate:(id)delegate; 
-(void)requestWithGraphPath:(NSString *)fbPath; 

其他類,一般ViewControllers,可以FacebookManager的委託(或者,如果需要的話,你可以處理的併發請求時,使代表的陣列)。當FacebookManager收到請求的響應時,它會將其傳遞給原始類。 答案,因爲它是每個FB請求的唯一代表,並且永遠不會通過您的程序釋放,即使原始類被釋放,也不會出現錯誤。

作爲所有這些的獎勵,如果不需要,您將自動失去那些您不需要實施的方法的警告。

希望這有助於任何方式!

1

正確的解決方案是在調用GraphAPI時保存FBRequest對象。 因此,當你的班級被處理時,你將能夠將它的委託屬性設置爲零。 因此清理你的亂七八糟,並避免由SDK的respondsToSelector方法造成的崩潰。

首先在你的class.h聲明FBRequest屬性:

@property (nonatomic, retain) FBRequest *fbRequest; 

合成它在你的class.m:

@synthesize fbRequest; 

設置它,當你調用圖形API像這樣:

fbRequest = [appDelegate.facebook requestWithGraphPath:@"me/feed" 
       andParams:params 
      andHttpMethod:@"POST" 
      andDelegate:self]; 

設置它的委託propery爲零你的類的dealloc方法:

-(void) dealloc 
{ 
    fbRequest.delegate = nil; 
    [fbRequest release]; 
    . 
    . 
    . 

    [super dealloc] 
}