处理iPad上的外部屏幕

时间:2010-07-13 11:55:07

标签: iphone ipad retain vga

好吧,我认为可能我误解了在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

2 个答案:

答案 0 :(得分:1)

你的问题在这里:

for (UIScreen *currentScreen in [UIScreen screens])
{
    if (currentScreen != [UIScreen mainScreen])
        self.externalScreen = [currentScreen autorelease];
}

删除autorelease。你不应该发布你没有创建或保留的东西。

答案 1 :(得分:0)

您正在

上自动释放externalView
self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease];

然后为其分配自动释放视图

self.externalScreen = [currentScreen autorelease];

您无法释放自动释放的视图,否则会崩溃。