2015-04-16 45 views
5

我对使用StrongWeak在我的特定情况下有点困惑。iOS中的强弱混淆

我有一个类ParentClass它有3 objectContainerClass1,ContainerClass2ContainerClass3

每个ContainerClass有可变对象像NSMutableArray

现在在我的情况下,其自身强大的性能,我只有一个ContainerClass一次显示,所以显示,如果ContainerClass1然后ContainerClass2ContainerClass3不是必需的。

所以我想当我显示ContainerClass1,将ContainerClass2ContainerClass3对象设置为nil。在这里,我很困惑,只是设置其他ContainerClass(未显示)到nilrelease其内存?因为它们对其他物体有很强的特性。

或者我需要先将所有其他ContainerClass's强属性设置为nil,然后将ContainerClass设置为nil

在此先感谢。

+0

首先,你应该总是设置IBOutlets弱。是的,当您将ContainerClass2设置为零时,它的所有IBOutlet都将变为零,因为其父项为零。 –

+0

同意Yogesh为IBOutlets :) –

+0

http://www.rypress.com/tutorials/objective-c/properties – Yuyutsu

回答

8

@ zoeb,可能这个链接将帮助你远离基本的内存问题。

how-to-overcome-memory-problems-in-iphone-applications-with-automatic-reference-counting

编辑:

我们都知道,苹果在IOS 5.0中引入ARC,ARC是编译器级别的功能,简化了Objective-C对象的生命周期的过程。在ARC引入之前,我们手动管理内存意味着“手动引用计数(MRC)”。通过MRC,开发人员需要记住何时发布或保留对象。意味着开发人员需要管理objective-c对象的生命周期。根据开发人员的观点,我们主要有兴趣在应用程序中添加新功能,而不是专注于内存问题。但事情可以肯定,内存管理在应用程序的成功中起着至关重要的作用为了给开发者提供帮助,Apple找出了自动管理内存的方法。

ARC聪明地管理内存,但这不是100%。我们需要在开发时关注一些要点,以便从缺乏内存问题中删除我们的应用程序。在这里我将尝试提供ARC基础应用程序中管理内存的解决方案。这也不是100%。但它会尽力帮助编译器估计客观对象的生命周期。

以下是您需要在每个控制器中实施的一些步骤。

步骤1.向应用程序中使用的每个UI声明弱属性。

实施例:
@property (nonatomic, weak) IBOutlet UIButton* btnPost;

@property (nonatomic, weak) IBOutlet UITableView* tblMessages; 

第2步。正如我们的开发人员最容易混淆的问题是,编译器是否允许在ARC基础应用程序中声明“dealloc”方法。答案是肯定的,但不允许在其中声明“[super dealloc]”。所以在每个控制器中覆盖“dealloc”方法。

-(void)dealloc{ 

} 

步骤3.“无”等的MKMapView,滚动型等

-(void)dealloc{ 
dictAddress = nil; 
arrayList = nil; 
[map removeFromSuperview]; 
[scrollView removeFromSuperview]; 
} 

步骤4.避免参考删除从上海华在“的dealloc”方法而不是设置只是重加载的对象死锁机制。 (例如:A类和B类在那里,B类被声明为属性类型为“Strong”的Delegate,这样A和B彼此依赖的A和B将会释放,所以在这种情况下,“dealloc”方法是没有调用任何类,所以类保留在内存中,为了移除这种情况,我们需要保持对Delegate对象的“Assign”引用。)这仅仅是举例。我们需要考虑其他方面,比如“保持块的弱引用,以便在执行完成后释放对象”。

这些是避免记忆问题的基本步骤。如果您遇到内存问题,那么您需要借助分析仪来查找泄漏和内存使用情况。

下面的链接将帮助你分析内存。

Mamory analyzer

+0

哦,我认为dealloc不会自动调用ARC –

+0

ARC中也调用了'dealloc'。所以将'nil'引用设为强变量。 –

+0

@无 - ARC **自动**处理强(弱)引用,即点。有没有**需要使用'dealloc'来将强变量设置为'nil'。所以第3步是毫无意义的。 – CRD