3

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

4

2 回答 2

1

你的问题在这里:

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

删除autorelease. 你不应该发布不是你创造或保留的东西。

于 2010-12-27T03:17:03.133 回答
0

您正在自动释放 externalView

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

然后为它分配一个自动释放视图

self.externalScreen = [currentScreen autorelease];

你不能释放一个自动释放的视图,否则它会崩溃。

于 2010-12-27T02:30:41.417 回答