我一直在做我的应用程序的春季大扫除。我注意到一些奇怪的东西,当我试图纠正它时,完全崩溃了我的应用程序。两个相互排斥的UIViews战略
我的应用有两个“路径”无论你在“A”部分还是在“B”部分。从“A”部分可以转到“B”部分,反之亦然。
我设计了它,以便应用程序委托类有两个方法; switchToAView
和switchToBView
在BView
中部所以是和调用应用程序的委托应该彻底释放与BView
一切,用户发送给AView
的switchToAView
方法。
我找到时切换到AView
BView
视图仍然保留。
每个视图都由属性保存。
interface;
@property(nonatomic, retain) UIView *viewA
@property(nonatomic, retain) UIView *viewB
implementation;
@synthesize viewA, viewB
在appDelegate中。
我在两个视图的dealloc方法中放置了一个断点。 (viewA
和viewB
)。 现在发生这种情况; 当加载viewA
并从那里切换到viewB
时,没有任何内容被释放(如预期的那样)。然后,当我从viewB
切换到viewA
时,viewA
首先被释放(通过生成的setter,据我所知)。 然后viewA
被初始化并显示。 这工作得很好,但缺点是viewA
和viewB
同时在堆栈中:/这是不可取的,因为它们是互斥的。该viewA
当一个新viewA
走来,然而,viewA
应该当viewB
被添加到窗口
然后我试图在switchToBView
方法释放viewA
释放才会释放。 从viewA
到viewB
时,这工作正常。我使用仪器进行了检查,viewA
的保留计数降为0。现在,切换时回viewA,应用程序崩溃,我认为这是因为:
self.viewA = newlyInstantiatedViewA;
二传手,首先发送释放消息viewA,但我早些时候发布viewA,这导致崩溃。
我无法理解这种使用setter的方式,会导致崩溃。 (“发送到释放实例的消息”,并且在调用[super dealloc]时添加到A的最后一个子视图的dealloc方法中破坏)
我是否应该一起选择不同的方法? 我将如何构建坚固的东西,确保一次只保留一个视图?
对不起,我写长,我会少写,如果我有更多的时间: 感谢您事先的任何解决方案或设计建议:)
没有在日志中? – willcodejavaforfood
嗨 只有“发送到解除分配的实例的消息”和实例是viewA:/ – RickiG
你可以发布多一点代码,特别是关于视图切换 – conorgriffin