在iPad上处理外部屏幕
问题描述:
好吧,我认为它可能是我误解了在iPad上实现外部屏幕的正确方法,它给我带来了很多令人头疼的问题。 由于这是一篇很长的文章,我想要做的是创建并通过VGA将视图发送到外部屏幕,并在完成后删除屏幕。我保留计数问题,所以无法使其工作。在iPad上处理外部屏幕
我有一个视图控制器,可以在任何时候调用到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
。
答
你的问题是在这里:
for (UIScreen *currentScreen in [UIScreen screens])
{
if (currentScreen != [UIScreen mainScreen])
self.externalScreen = [currentScreen autorelease];
}
取出autorelease
。你不应该发布你没有创建或保留的东西。
答
你在
self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease];
自动释放externalView然后分配一个自动释放,以便它
self.externalScreen = [currentScreen autorelease];
您无法释放的自动释放的看法,否则就会崩溃。