2011-07-30 73 views
0

我用我的應用程序(特別是https://github.com/jazzychad/CEPubnub)外部庫,我遇到一個內存管理問題。在「CEPubnub」對象初始化之後,必須訂閱用於接收更新的頻道。因此,我最後寫了下面的代碼:Pubnub內存管理問題

self.pubnub = [[[CEPubnub alloc] 
      publishKey:@"..." 
      subscribeKey:@"..." 
      secretKey:@"..." 
      sslOn:NO 
      origin:@"pubsub.pubnub.com"] autorelease]; 
//Set the channel for this holler 
[self setPubnubChannel:[[[NSMutableString alloc] initWithString:@"channelprefix_"] autorelease]]; 
[pubnubChannel appendString:[event eventId]]; 
NSLog(@"Subscribing to the pubnubChannel: %@", (NSString *)[[pubnubChannel copy] autorelease]); 

每當我結束了運行該應用程序並加載認爲,這就是所謂的,退出的觀點,再重新裝回,我終於最終導致記憶泄漏和第二行代碼被突出顯示爲問題的根源(通過我的泄漏工具)。

當運行分析,同時也突出的第二行代碼,但表示「電位上[線1]分配對象的泄漏」,就好像所述第一線的問題。在我的viewDidUnload方法和dealloc方法中,我確保釋放pubnub屬性,但它似乎仍然泄漏,我感到目瞪口呆。關於我應該做什麼的任何想法?

+0

我CEPubNub的作者。如果沒有看到該類的其餘代碼(頭文件,上面代碼片段中的代碼,至少init函數和dealloc函數),將很難確切地知道發生了什麼。 'pubnub'是一個實例變量嗎?它是合成的嗎?樂於幫助,但首先需要更多信息。 – 2011-07-30 18:17:21

回答

2

我在這裏學到了這些:樂器只是向您展示泄漏物體的創建位置。跟着你的代碼的進程,你必須在別處保留其中一個對象而沒有另一個相應的版本。

如果pubnub是一個屬性,你是參照實例變量pubnub繞過制定者。如果是這種情況,將其更改爲self.pubnub並添加autorelease。那應該解決它。

self.pubnub = [[[CEPubnub alloc] 
     publishKey:@"..." 
     subscribeKey:@"..." 
     secretKey:@"..." 
     sslOn:NO 
     origin:@"pubsub.pubnub.com"] autorelease]; 
+0

謝謝Dean,我只知道這裏只有一個對象沒有被我手動發佈:NSMutableArray。由於pubnub是一個指向正在初始化的CEPubNub對象的指針,你覺得我需要[pubnub release]以外的東西嗎? –

+0

所以我已經確認這個問題是與pubnub對象...顯然我錯過了那裏的東西 –

+0

我需要看到更多的代碼。關於pubnub的事情讓我感到困惑。這是一個財產的伊娃。這將解釋它。如果是這樣,你應該指的是self.pubnub。 –

0

CEPUBNUB弧

http://dashasalo.com/tag/pubnub/

直接下載:http://dashasalo.com/wp-content/uploads/cepubnub/CEPubnub_ARC.zip

如果你正在努力,以與ARC CEPubnub工作,那麼下面就是我如何解決它爲我自己,

  1. 從所有CEPubnub文件中刪除所有提及的釋放和自動釋放。我不得不刪除不少,但它非常簡單。

  2. 下一步是重命名調用初始化對象上自開始與「初始化」的所有方法。 CEPubnub.h /.m和CEPubnubRequest.h /.m中會有一對。不要忘記找到調用這些方法的位置,並相應地更新方法名稱。例如,更改以下:

  3. 如果你再運行分析會說,有在用urlencode方法潛在的內存泄漏。我不得不將CFURLCreateStringByAddingPercentEscapes的結果分配給一個新的NSString對象來擺脫警告。