2011-07-30 12 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]); 

、私は最終的にメモリを引き起こしてしまう。そのため、私は以下のコードを書くことになりましたリークと2番目のコード行が問題の原因として強調されています(私のリーク機器を介して)。

Analyzeを実行すると、コードの2行目も強調表示されますが、最初の行が問題であるかのように「[1行目]に割り当てられたオブジェクトの潜在的なリーク」と表示されます。私のviewDidUnloadメソッドとdeallocメソッドでは、私はpubnubプロパティを解放することを確認しますが、それはまだ漏れているようですが、私は馬鹿げています。私が何をすべきかについてのアイデアは何ですか?

+0

私はCEPubNubの著者です。そのクラスの残りのコード(ヘッダーファイル、上のスニペットの周辺コード、init関数、およびdealloc関数)を見ることなく、何が起こっているのかを正確に伝えるのは本当に難しいでしょう。 'pubnub'はインスタンス変数ですか?それは合成されていますか?喜んで助けますが、もっと多くの情報が必要です。 –

答えて

2

私はこれを学びました。計測器は、漏れたオブジェクトがどこに作成されたかを示すだけです。コードに沿って、別の対応リリースがなければ、これらのオブジェクトの1つを別の場所に保持しておく必要があります。

pubnubがプロパティの場合、インスタンス変数pubnubを参照してセッターをバイパスしています。このような場合は、self.pubnubに変更してautoreleaseを追加してください。それはそれを解決するはずです。 ARC

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

直接ダウンロードWITH

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

ありがとうございましたDean、私が知る限り手作業でリリースされていないオブジェクトは1つだけです:NSMutableArray。 pubnubは初期化されるCEPubNubオブジェクトへのポインタなので、[pubnub release]以外にも何か必要があると思いますか? –

+0

私は問題がpubnubオブジェクトであることを確認しました...明確に私はそこに何かを見逃しています –

+0

あなたのコードをもっと見る必要があります。 pubnubについて私は困惑しています。それは財産の象牙ですか?それはそれを説明するでしょう。もしそうなら、あなたはself.pubnubを参照するべきです。 –

0

CEPUBNUB:http://dashasalo.com/wp-content/uploads/cepubnub/CEPubnub_ARC.zip

あなたはCEPubnubはその後、下記のARCで動作させるのに苦労している場合は、私は自分のためにそれを解決する方法です。

  1. すべてのCEPubnubファイルからすべてのリリースおよび自動解放に関する記述を削除します。私はかなりの数を取り除かなければなりませんでしたが、それはとても簡単でした。

  2. 次のステップでは、オブジェクトself上のinitを呼び出すすべてのメソッドの名前を "init"で始まる名前に変更します。 CEPubnub.h /.mとCEPubnubRequest.h/mには2つの組み合わせがあります。これらのメソッドがどこに呼び出されているかを調べ、それに応じてメソッド名を更新することを忘れないでください。たとえば、次のように変更します。

  3. Analyzerを実行すると、urlencodeメソッドにメモリリークが発生する可能性があります。 CFURLCreateStringByAddingPercentEscapesの結果を新しいNSStringオブジェクトに割り当てて、警告を取り除かなければなりませんでした。