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]);

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

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

4

2 回答 2

2

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

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

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

带有ARC的CEPUBNUB

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

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

如果您正在努力使 CEPubnub 与 ARC 一起工作,那么下面是我自己解决的方法。

  1. 从所有 CEPubnub 文件中删除所有关于发布和自动发布的提及。我不得不删除很多,但它非常简单。

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

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

于 2012-04-30T17:48:49.757 回答