好吧,我认为可能我误解了在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
。
答案 0 :(得分:1)
你的问题在这里:
for (UIScreen *currentScreen in [UIScreen screens])
{
if (currentScreen != [UIScreen mainScreen])
self.externalScreen = [currentScreen autorelease];
}
删除autorelease
。你不应该发布你没有创建或保留的东西。
答案 1 :(得分:0)
您正在
上自动释放externalViewself.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease];
然后为其分配自动释放视图
self.externalScreen = [currentScreen autorelease];
您无法释放自动释放的视图,否则会崩溃。