0

アプリケーション (具体的にはhttps://github.com/jazzychad/CEPubnub )で外部ライブラリを使用しており、メモリ管理の問題が発生しています。「CEPubnub」オブジェクトの初期化に続いて、更新を受信するためにチャネルに登録する必要があります。そのため、次のコードを書くことになりました。

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 プロパティを解放するようにしていますが、それでも漏れているようで、唖然とします。私が何をすべきかについてのアイデアはありますか?

4

2 に答える 2

2

ここでこれを学びました。instruments は、リークするオブジェクトが作成された場所を表示するだけです。コードの過程に沿って、これらのオブジェクトの 1 つを別の場所で保持する必要があり、別の対応するリリースは必要ありません。

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

self.pubnub = [[[CEPubnub alloc] 
      publishKey:@"..." 
      subscribeKey:@"..." 
      secretKey:@"..." 
      sslOn:NO 
      origin:@"pubsub.pubnub.com"] autorelease];
于 2011-07-30T17:48:26.767 に答える
0

セパブナブ with ARC

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

直接ダウンロード: http://dashasalo.com/wp-content/uploads/cepubnub/CEPubnub_ARC.zip

CEPubnub を ARC で動作させるのに苦労している場合、以下は私が自分で解決した方法です。

  1. すべての CEPubnub ファイルから release と autorelease に関する記述をすべて削除します。かなりの数を削除する必要がありましたが、非常に簡単でした。

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

  3. その後、Analyzer を実行すると、urlencode メソッドに潜在的なメモリ リークがあると表示されます。警告を取り除くために、CFURLCreateStringByAddingPercentEscapes の結果を新しい NSString オブジェクトに割り当てる必要がありました。

于 2012-04-30T17:48:49.757 に答える