为啥以下被认为是内存泄漏?

Posted

技术标签:

【中文标题】为啥以下被认为是内存泄漏?【英文标题】:Why are the following considered memory leaks?为什么以下被认为是内存泄漏? 【发布时间】:2012-07-19 09:47:18 【问题描述】:

我只是想知道是否有人可以向我解释为什么以下几行显示为 Instruments 内存泄漏:

self.videoEngine = [[VideoEngine alloc] initWithCallbackName:@"IntroFinished"];

self.videoEngine = [[VideoEngine alloc] initWithCallbackName:@"MainMovieFinished"];

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];

NSString *locationName2 = [[NSString alloc] initWithString:[locationName substringFromIndex:test]];

初始化时不使用预设的 NSString 有问题吗?在 self.videoEngine 和 self.timerMap 的示例中,它们都具有(非原子,保留)属性,并且在使用前被合成。

【问题讨论】:

【参考方案1】:

如果您不使用 Arc(我认为您没有使用 Arc),那么这将是您的内存泄漏。

当您分配 VideoEngine 属性时,它正在对您的对象执行另一个保留。您需要在 alloc 语句的末尾添加 autorelease。

self.videoEngine = [[[VideoEngine alloc] initWithCallbackName:@"IntroFinished"] autorelease];

self.videoEngine = [[[VideoEngine alloc] initWithCallbackName:@"MainMovieFinished"] autorelease];

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];

NSString *locationName2 = [[NSString alloc] initWithString:[locationName substringFromIndex:test]];

【讨论】:

谢谢,你能解释一下为什么我需要自动释放它们,即使我稍后释放它们?我也想到了自己的重点。是看指针是否等于新值,如果不释放呢?我现在真的很困惑...... 当您像使用 VideoEngine 一样分配对象时,该对象的保留计数为 1。并且因为您的属性被声明为 (nonatomic, retain) 它也会在分配对象时增加对象的保留计数。 哦,好吧,如果我执行以下操作:VideoEngine *ve = [[VideoEngine alloc] etc],然后 self.videoEngine = ve; , 然后 [ve 释放]。应该没问题吧?

以上是关于为啥以下被认为是内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

这是java内存泄漏吗

仪器报告内存泄漏。不明白为啥

为啥这段代码不会导致内存泄漏? [复制]

为啥这会导致内存泄漏?

RxSwift 为啥我们没有调用 dispose 会有内存泄漏

为啥lua语言中使用全局变量就会造成内存泄漏呢??