我在我的应用程序中使用外部库(特别是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属性,但它似乎仍然泄漏,我傻眼了。关于我应该做什么的任何想法?
答案 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协同工作,那么下面是我为自己解决的问题。
从所有CEPubnub文件中删除所有提及的释放和自动释放。我不得不删除很多,但这非常简单。
下一步是将所有在对象self上调用init的方法重命名为以“init”开头。在CEPubnub.h /.m和CEPubnubRequest.h /.m中会有一对。不要忘记查找调用这些方法的位置并相应地更新方法名称。例如,更改以下内容:
如果你然后运行Analyzer,它会说urlencode方法中存在潜在的内存泄漏。我必须将CFURLCreateStringByAddingPercentEscapes的结果分配给新的NSString对象以消除警告。