目标c中的棘手内存管理

pse*_*ach 0 iphone memory-leaks objective-c

阅读: Objective-c中的视图控制器的内存管理

UIView的addSubview真的保留了视图吗?

我编写了以下代码来切换子视图:

@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
Run Code Online (Sandbox Code Playgroud)

如果我注释掉释放线,它似乎运行正常,但我无法理解为什么.这是我理解发生了什么的方式,也许有人可以告诉我哪里出错了:

所以我们考虑一下currentView:

  • A由"新"消息分配 - 保留计数= A:1

  • A由setter保留 - 保留计数= A:2

  • A的视图得到(据称)保留 - 保留计数= A:2.1

下次通过......

  • A的子视图被释放count = A:2

  • B由"新"消息分配 - 保留计数= B:1,A:2

  • A由设定者自动释放 - B:1,A:1

  • B由设定者保留 - B:1,A:1

  • 什么都没有摆脱A?

那么我应该更改我的代码,还是我错误地了解内存管理在这种语言中的工作方式......或者两者兼而有之?

jer*_*jer 5

好的,第一步,忽略了retainCount.这是Apple应该重命名的事情之一,lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho因此人们不会猜到它的名字,而不是在文档中列出它.出于您的目的,它完全没用,所以请忽略它.

现在我已经说过了,让我们考虑一下:addSubview:DOES保留其论点,并removeFromSuperview释放接收器.

最后,很难说是什么currentSubview.它有一个view倾向于VC 的属性,然而,你自己使用它的方式,将表明它是一个普通的视图.也许你可以澄清所以我可以继续我的答案.