2010-11-02 28 views
0

阅读后: Memory management of a view controller in Objective-c整蛊内存管理

Does UIView's addSubview really retain the view?

我写了下面的代码来切换子视图:

@synthesize switchableView, viewSelector, currentSubview; 

//... 

if(switchableView.subviews.count != 0) 
[[switchableView.subviews objectAtIndex:0] removeFromSuperview]] 
self.currentSubview = (veiwSelector.selectedSegmentIndex == 0) ? 
[ViewA new] : [ViewB new]; 
[switchableView addSubview:currentSubview.view]; 

//[currentSubview release]; //<---crashes if I uncomment this line 

它似乎运行很好,如果我注释掉这条发行版,但我无法绕过原因。这是我理解的方式会发生什么,也许有人可以告诉我在哪儿出错:

所以,让我们考虑currentView:

  • 一个由“新”的消息得到的alloc-ED - 保留计数=答:1

  • 甲得到由设定器保持 - 保留计数= A:2

  • A的视图获得(假定)保留 - 保留计数= A:2.1

下一次通过...

  • A的子视图得到释放计数= A:2

  • 乙通过 '新的' 消息获取的alloc-ED - 保留计数= B:1 1,A:1

  • - ,A::1,A:2

  • 甲得到由setter--乙自动释放乙1个

  • B获得由设定器保持

  • 什么都没有摆脱A?

所以我要改变我的代码,还是我错了的方式存储管理工作在这种语言...或两者 -

+1

你有一个额外] removeFromSuperview – robev 2010-11-02 20:41:07

回答

0

您对保留和释放的理解是正确的,您的代码也是如此。这表明问题出在您发布的代码之外。例如,如果您的currentSubView属性定义为assign而不是retain,则会出现此问题。

但是,您的代码结构不够好。这将是更加清晰:

self.currentSubView = [[ViewA new] autorelease]; 

此外,图控制器意在被高速缓存,而不是创建并且每个用户切换显示时间释放。通常,您事先创建视图控制器,并在必要时访问其.view属性以显示视图。 UIViewController将在低内存条件下自动释放不可见视图,并在访问.view属性时重新分配其视图。

5

好吧,一步一个,忽略retainCount。这是苹果应该重新命名为lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho之类的东西之一,所以人们不会猜出它的名字,也不会在文档中列出它。出于你的目的,这完全没用,所以不要理它。

现在我已经说了,让我们考虑一下:addSubview:是否保留它的参数,并且removeFromSuperview释放接收器。

最后,很难说什么currentSubview是。它有一个view财产,它会倾向于一个VC,但是,你自己使用它的方式,将表明它是一个正常的观点。也许你可以澄清,所以我可以继续我的答案。

+2

+1后'retainCount' – PostMan 2010-11-02 20:39:47

+0

其视图控制器 – pseudopeach 2010-11-02 21:42:20

+0

lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho ...检查!那么你在O-C中遵循什么规则?因为显然,整个释放或自动释放你分配的所有东西都是一堆垃圾。 – pseudopeach 2010-11-02 21:49:41

0

更改释放行

self.currentSubview = nil; 

,我想你会没事的。您正在释放,但不会将该属性设置为零。因此,下次重新分配时,将再次调用释放。但是你已经发布了它,所以......繁荣。