我正在使用ARC在iOS 7上开发项目,我想在发布viewController时发布私有(private)属性
这是作为模态视图 Controller 呈现的TestViewController,它为viewDidLoad中的私有(private)属性testAVPlayer设置了一个值:

//TestViewController.m
#import "TestAVPlayer.h"
@interface TestViewController () {
    TestAVPlayer *testAVPlayer;
}

@end

- (void)viewDidLoad
{
    [self setupPlayer];
}

- (void)setupPlayer {
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"]];
    testAVPlayer = [TestAVPlayer playerWithPlayerItem:item];

    [testAVPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
    [testAVPlayer play];
}

- (void)dealloc {
    NSLog(@"dealloc TestViewController: %@", self);
}

TestAVPlayer是AVPlayer的子类,我将NSLog放入dealloc中
// TestAVPlayer.h
#import <AVFoundation/AVFoundation.h>

@interface TestAVPlayer : AVPlayer

@end

//  TestAVPlayer.m
#import "TestAVPlayer.h"

@implementation TestAVPlayer

- (void)dealloc {
    NSLog(@"dealloc testAVPlayer: %@", self);
}
@end

关闭TestViewController时,似乎从未释放过testAVPlayer,我看到了“dealloc TestViewController”,但是控制台日志中没有“dealloc testAVPlayer”

最佳答案

我尝试了您的代码,问题是,即使您调用[TestAVPlayer playerWithPlayerItem:item]TestAVPlayer类也没有这种方法,所以它将从playerWithPlayerItem:基类调用AVPlayer函数,该函数将返回AVPlayer类的实例,而不是TestAVPlayer类。编译器不会给您任何警告,因为playerWithPlayerItem:方法返回了id类型。如果使用调试器进行检查,您会看到私有(private)变量的类型不是TestAVPlayer:

永远不会调用deallocTestAVPlayer,因为未创建此类对象。
AVPlayer被释放时,TestViewController实例被释放。您可以通过使用Instruments或简单地将符号断点添加到[AVPlayer dealloc]来进行检查。

选择Breakpoint Navigator,然后单击+按钮并添加Symbolic Breakpoint。

[AVPLayer dealloc]写入符号字段,然后按Enter。当您运行该应用程序并释放TestViewController时,您会看到断点将被命中,因此AVPlayer确实被释放了。

关于ios - 如何使用ARC在iOS 7中释放私有(private)属性(property),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25561945/

10-12 14:36