好的,我认为我可能误解了在 iPad 上实现外部屏幕的正确方法,这让我很头疼。 由于这是一篇很长的帖子,我要做的是通过 VGA 创建并发送视图到外部屏幕,并在完成后移除屏幕。我遇到了保留计数问题,因此无法正常工作。
我有一个可以随时在 iPad 上调用的视图控制器。当这个视图加载时(它是一个遥控器,类似于 Keynote 演示文稿),我检查外部屏幕,然后创建一个窗口并将视图添加到额外的监视器。
在我的ipadViewController.h
<-- 留在 iPad 上的视图
我有
@interface ipadViewController : UIViewController {
PresentationViewController *presentationView;
UIScreen *externalScreen;
UIWindow *externalWindow;
}
@property (nonatomic, retain) UIScreen *externalScreen;
@property (nonatomic, retain) UIWindow *externalWindow;
@property (nonatomic, retain) PresentationViewController *presentationView;
@end
(还有更多,但那是外部屏幕的东西)。
在ipadViewController.m
:
@synthesize externalScreen;
@synthesize externalWindow;
@synthesize presentationView;
所以我尝试在视图加载时做一些事情:
获取外部屏幕(如果可能)创建一个presentationViewController
并将其添加到额外屏幕
- (void)viewDidLoad {
[super viewDidLoad];
[self getExternalScreen];
[self createPresentationAndSendToWindow];
}
要获得屏幕,我执行以下操作getExternalScreen:
:
if ([[UIScreen screens] count] > 1)
{
for (UIScreen *currentScreen in [UIScreen screens])
{
if (currentScreen != [UIScreen mainScreen])
self.externalScreen = [currentScreen autorelease];
}
}
并将视图发送给它createPresentationAndSendToWindow:
:
if (self.presentationPath == nil) return;
PresentationViewController *viewController = [[PresentationViewController alloc] initWithNibName:@"CanvasPresentation" bundle:nil];
self.presentationView = viewController;
[viewController release];
if (self.externalWindow == nil)
{
CGRect externalBounds = [self.externalScreen bounds];
self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease];
[self.externalWindow addSubview:self.presentationView.view];
self.externalWindow.screen = self.externalScreen;
[self.externalWindow makeKeyAndVisible];
}
在dealloc
我尝试清理:
[presentationView release];
[externalScreen release];
//[externalWindow release]; <- that would crash
我遇到的问题是,当我关闭remoteViewController
(它是模态的)时,释放后externalScreen
保留计数 = 1,而 externalWindow 保留计数 = 2。
externalWindow release
如果我不释放,由引起的崩溃就会消失presentationView
(但后来我正在泄漏presentationView
.