Iphone objective-c中棘手的内存管理

Iphone objective-c中棘手的内存管理,iphone,objective-c,memory-leaks,Iphone,Objective C,Memory Leaks,阅读后: 及 我编写了以下代码来切换子视图: @synthesize switchableView, viewSelector, currentSubview; //... if(switchableView.subviews.count != 0) [[switchableView.subviews objectAtIndex:0] removeFromSuperview]] self.currentSubview = (veiwSelector.selectedSegmentInd

阅读后:

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

@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
@synthesis-switchableView、viewSelector、currentSubview;
//...
if(switchableView.subviews.count!=0)
[[switchableView.subviews对象索引:0]从SuperView移除]]
self.currentSubview=(veiwSelector.selectedSegmentIndex==0)?
[ViewA new]:[ViewB new];
[switchableView添加子视图:currentSubview.view];

//[当前子视图发布]// 好的,第一步,忽略
retainCount
。这是苹果应该重命名为类似于
lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho的东西之一,这样人们就不会猜到它的名字,也不会在文档中列出它。就你的目的而言,这是完全无用的,所以忽略它

现在我已经说过了,让我们考虑一下:<代码> AddiSave::/Cult>确实保留它的参数,而<代码> ReaveFuxVIEW 释放接收器。


最后,很难说什么是
currentSubview
。它有一个
视图
属性,该属性倾向于VC,但是,您单独使用它的方式表明它是一个普通视图。也许你可以澄清一下,这样我可以继续我的回答。

好的,第一步,忽略
重新计算。这是苹果应该重命名为类似于
lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho的东西之一,这样人们就不会猜到它的名字,也不会在文档中列出它。就你的目的而言,这是完全无用的,所以忽略它

现在我已经说过了,让我们考虑一下:<代码> AddiSave::/Cult>确实保留它的参数,而<代码> ReaveFuxVIEW 释放接收器。


最后,很难说什么是
currentSubview
。它有一个
视图
属性,该属性倾向于VC,但是,您单独使用它的方式表明它是一个普通视图。也许你可以澄清一下,这样我可以继续我的回答。

将发布行更改为

self.currentSubview = nil;

我想你会没事的。您正在释放,但未将属性设置为nil。所以,当它下次通过重新分配时,将再次对其调用release。但是你已经发布了,所以。。。动臂。

将释放管路更改为

self.currentSubview = nil;

我想你会没事的。您正在释放,但未将属性设置为nil。所以,当它下次通过重新分配时,将再次对其调用release。但是你已经发布了,所以。。。boom.

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

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

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

此外,视图控制器意味着缓存,而不是在用户每次切换显示时创建和释放。通常,您需要事先创建视图控制器,并在需要显示视图时访问其
.view
属性
UIViewController
将在内存不足的情况下自动取消分配不可见的视图,并在访问
.view
属性时重新分配它们的视图

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

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

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

此外,视图控制器意味着缓存,而不是在用户每次切换显示时创建和释放。通常,您需要事先创建视图控制器,并在需要显示视图时访问其
.view
属性
UIViewController
将在内存不足的情况下自动取消分配不可见的视图,并在访问
.view
属性时重新分配它们的视图

您有一个额外的]从Superview删除后您有一个额外的]从Superview删除后的DJIOFSUDFOIWJERIOWHFIUWHHRTEIUHWEIFHSDJKFHSIURWOIEURIOSFHO。。。检查!那么你在O-C中遵循什么规则呢?因为很明显,你所分配的全部释放或自动释放都是一堆废话。。。一旦你学会了这几条简单的规则,你就会很好地理解你需要了解的关于内存管理的大量知识。他没有使用retainCount方法,他只是简单地计算他自己使用的retain和release,这是非常好的。lsdjiofsudfoiwjeriowhfiuwhhrteiuhweifhsdjkfhsiurwoieuriosfho。。。检查!那么你在O-C中遵循什么规则呢?因为很明显,你所分配的全部释放或自动释放都是一堆废话。。。一旦你学会了这几条简单的规则,你就可以很好地理解你需要了解的关于内存管理的大量知识。他没有使用retainCount方法,他只是计算他自己使用的retain和release,这很好。