Pubnub内存管理问题

时间:2011-07-30 17:40:17

标签: objective-c pubnub

我在我的应用程序中使用外部库(特别是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]);

每当我最终运行此应用程序并加载调用此视图的视图时,退出视图,再次加载它,最终导致内存泄漏,第二行代码突出显示为问题(通过我的泄漏仪器)。

当我运行Analyze时,它还突出显示第二行代码但是说“在[第1行]上分配的对象可能泄漏”,好像第一行是问题。在我的viewDidUnload方法和dealloc方法中,我确保释放pubnub属性,但它似乎仍然泄漏,我傻眼了。关于我应该做什么的任何想法?

2 个答案:

答案 0 :(得分:2)

我在这里学到了:仪器只显示泄漏对象的创建位置。在代码的过程中遵循这一点,您必须在其他地方再次保留其中一个对象,而无需另外相应的版本。

如果pubnub是属性,则通过引用实例变量pubnub来绕过setter。如果是这种情况,请将其更改为self.pubnub并添加autorelease。应该解决它。

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

答案 1 :(得分:0)

CEPUBNUB WITH ARC

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

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

如果您正在努力使CEPubnub与ARC协同工作,那么下面是我为自己解决的问题。

  1. 从所有CEPubnub文件中删除所有提及的释放和自动释放。我不得不删除很多,但这非常简单。

  2. 下一步是将所有在对象self上调用init的方法重命名为以“init”开头。在CEPubnub.h /.m和CEPubnubRequest.h /.m中会有一对。不要忘记查找调用这些方法的位置并相应地更新方法名称。例如,更改以下内容:

  3. 如果你然后运行Analyzer,它会说urlencode方法中存在潜在的内存泄漏。我必须将CFURLCreateStringByAddingPercentEscapes的结果分配给新的NSString对象以消除警告。