2010-07-13 90 views
3

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

回答

1

你的问题是在这里:

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

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

0

你在

self.externalWindow = [[[UIWindow alloc] initWithFrame:externalBounds] autorelease]; 

自动释放externalView然后分配一个自动释放,以便它

self.externalScreen = [currentScreen autorelease]; 

您无法释放的自动释放的看法,否则就会崩溃。