2011-07-30 74 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对象来摆脱警告。