Iphone 设置self后释放temp对象是否正确?

Iphone 设置self后释放temp对象是否正确?,iphone,objective-c,initialization,release,self,Iphone,Objective C,Initialization,Release,Self,假设player是(非原子的,retain),并且是使用player=\u player合成的,那么以下哪种场景是正确的编码实践 情景A MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; self.player = mp; [mp release]; 情景B MPMoviePlayerController *mp = [[MPM

假设player是(非原子的,retain),并且是使用player=\u player合成的,那么以下哪种场景是正确的编码实践

情景A

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
        self.player = mp;
        [mp release];
情景B

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    self.player = mp;
到目前为止,我一直在使用场景A作为一般实践,但我认为这可能会导致代码内存泄漏

谢谢你的帮助

编辑1:

计时器也是如此,它们给我带来了麻烦。如果我使用下面的代码,这是正确的吗?如果timerMap也是(非原子的,retain),则使用timerMap=\u timerMap

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

当发布时,只是失效是可以的,还是应该失效然后发布?

方案A肯定是要走的路,方案B会泄漏
mp

资料来源:

编辑1:

您发布的代码错误,再次设置
timerMap
属性时会导致崩溃。您不能
自动释放它

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];
当你不再需要计时器时,只要

self.timerMap = nil; 

这将调用计时器上的
release
方法,并将指针设置为
nil

场景A肯定是要走的路,场景B将泄漏
mp

资料来源:

编辑1:

您发布的代码错误,再次设置
timerMap
属性时会导致崩溃。您不能
自动释放它

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];
当你不再需要计时器时,只要

self.timerMap = nil; 

这将调用计时器上的
release
方法,并将指针设置为
nil

场景A是否正确。场景B实际上会导致内存泄漏,这是因为self.player=mp;保留引用计数器

以下代码也是正确的:

MPMoviePlayerController *mp = [[[MPMoviePlayerController alloc] initWithContentURL:movieURL] autorelease];
self.player = mp;

情景A是正确的。场景B实际上会导致内存泄漏,这是因为self.player=mp;保留引用计数器

以下代码也是正确的:

MPMoviePlayerController *mp = [[[MPMoviePlayerController alloc] initWithContentURL:movieURL] autorelease];
self.player = mp;

第一个是正确的内存管理,但我倾向于:

self.player = [[[MPMoviePlayerController alloc] 
                 initWithContentURL:movieURL] 
                 autorelease];
这样,我将该对象的所有内存管理保持在一行上

编辑 以下是对问题的编辑


现在的计时器对象已经自动释放了,您不应该再向它添加自动释放。请看一下便利方法的说明。

第一个是正确的内存管理,但我倾向于:

self.player = [[[MPMoviePlayerController alloc] 
                 initWithContentURL:movieURL] 
                 autorelease];
这样,我将该对象的所有内存管理保持在一行上

编辑 以下是对问题的编辑


现在的计时器对象已经自动释放了,您不应该再向它添加自动释放。请查看有关便利方法的说明。

非常感谢,我的应用程序肯定有来自其他地方的内存泄漏。令人恼火的是,它没有被仪器检测到:(项目->分析工具很适合检测内存泄漏(它会检测到场景B)。试试看!非常感谢,我的应用程序肯定有来自其他地方的内存泄漏。令人恼火的是,它没有被仪器检测到:(Project->analysis工具很适合检测内存泄漏(它会检测到场景B)。试一试!有关合成和属性的说明,请参阅。有关合成和属性的说明。有关信息,您是否有机会帮助我编辑我的文章?谢谢您提供的信息,您是否有机会帮助我编辑我的文章?