我正在使用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:
永远不会调用dealloc
的TestAVPlayer
,因为未创建此类对象。
当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/