2010-03-02 79 views
2

我一直在做我的应用程序的春季大扫除。我注意到一些奇怪的东西,当我试图纠正它时,完全崩溃了我的应用程序。两个相互排斥的UIViews战略

我的应用有两个“路径”无论你在“A”部分还是在“B”部分。从“A”部分可以转到“B”部分,反之亦然。

我设计了它,以便应用程序委托类有两个方法; switchToAViewswitchToBView

BView中部所以是和调用应用程序的委托应该彻底释放与BView一切,用户发送给AViewswitchToAView方法。

我找到时切换到AViewBView视图仍然保留。

每个视图都由属性保存。

interface; 
@property(nonatomic, retain) UIView *viewA 
@property(nonatomic, retain) UIView *viewB 
implementation; 
@synthesize viewA, viewB 

在appDelegate中。

我在两个视图的dealloc方法中放置了一个断点。 (viewAviewB)。 现在发生这种情况; 当加载viewA并从那里切换到viewB时,没有任何内容被释放(如预期的那样)。然后,当我从viewB切换到viewA时,viewA首先被释放(通过生成的setter,据我所知)。 然后viewA被初始化并显示。 这工作得很好,但缺点是viewAviewB同时在堆栈中:/这是不可取的,因为它们是互斥的。该viewA当一个新viewA走来,然而,viewA应该当viewB被添加到窗口

然后我试图在switchToBView方法释放viewA释放才会释放。 从viewAviewB时,这工作正常。我使用仪器进行了检查,viewA的保留计数降为0。现在,切换时回viewA,应用程序崩溃,我认为这是因为:

self.viewA = newlyInstantiatedViewA; 

二传手,首先发送释放消息viewA,但我早些时候发布viewA,这导致崩溃。

我无法理解这种使用setter的方式,会导致崩溃。 (“发送到释放实例的消息”,并且在调用[super dealloc]时添加到A的最后一个子视图的dealloc方法中破坏)

我是否应该一起选择不同的方法? 我将如何构建坚固的东西,确保一次只保留一个视图?

对不起,我写长,我会少写,如果我有更多的时间: 感谢您事先的任何解决方案或设计建议:)

+0

没有在日志中? – willcodejavaforfood

+0

嗨 只有“发送到解除分配的实例的消息”和实例是viewA:/ – RickiG

+0

你可以发布多一点代码,特别是关于视图切换 – conorgriffin

回答

4

我应该选择不同的 所有方法一起?

非常明显,您将视图控制器逻辑混合到您的视图中,并且您的视图相互之间保留着相互似乎是循环引用的视图。

(1)视图不应该加载其他视图的逻辑。加载和卸载视图是视图控制器的功能。视图只应关注与显示相关的逻辑。它甚至不应该存储或操纵任何用户数据。

(2)视图控制器应该很少调用其他视图控制器。视图控制器应该关心管理视图和从视图读取和写入数据到数据模式。

(3)如果您需要关联视图,请使用UINavigation控制器。这不仅仅是严格的视觉分层视图模式。另外,您可以隐藏导航栏,以便用户永远不会看到它。您需要有一个视图控制器,该视图控制器可以推送viewA,并且当您需要viewB时,请调用nav来弹出viewA并推送viewB。对用户来说,它看起来像是视图只是简单地交换我们的视图。查看效用翻转视图以获得类似用途。

您的应用程序暂时工作,因为语言或API中没有任何内容阻止您将几乎整个应用程序逻辑塞满视图子类。但是,保持这样的设计运行和可靠几乎是不可能的。

+0

Hi TechZen。你当然是完全正确:) 3个月前,我做了这个“设计”,当时我的可可触摸体验很少。 (viewA和viewB是viewControllers而不只是视图,但你的观点仍然有效)。通过将其全部包装在navigationController中,我将获得我可以从SDK中获得的所有帮助(内存管理)。 我一直在回放我脑海中的每一个场景,navController方法照顾我可以自己绘制的每个角落。 我的viewA实际上是一个navController,在我的AppDelegate中实例化,因此将它延伸到viewB是一个Cakewalk。 谢谢:) – RickiG