iOS 中的Strong和Weak混淆问题

5
我有一些困惑,关于在我的情况下何时使用"Strong"或"Weak"。我有一个类ParentClass,其中有3个对象ContainerClass1、ContainerClass2和ContainerClass3。每个ContainerClass都有自己强的属性,例如NSMutableArray等可变对象。现在,在我的情况下,我只需要显示一个ContainerClass,所以如果显示ContainerClass1,则不需要ContainerClass2和ContainerClass3。因此,当我显示ContainerClass1时,我想将ContainerClass2和ContainerClass3对象设置为nil。这里我不确定只是将其他未显示的ContainerClass设置为nil是否会释放其内存?因为它们对其他对象具有强引用。或者我应该先将所有其他ContainerClass的强引用属性设置为nil,然后再将ContainerClass本身设置为nil吗?谢谢。

首先,您应该始终为IBOutlets设置弱引用。当您将ContainerClass2设置为nil时,它的所有IBOutlets都会变为nil,因为它的父视图是nil。 - Yogesh Suthar
同意 Yogesh 的 IBOutlets :) - Zoeb S
http://www.rypress.com/tutorials/objective-c/properties - Yuyutsu
@YogeshSuthar 我编辑了我的问题,现在它不仅仅是关于IBOutlets的问题。 - Zoeb S
2个回答

8

希望这个链接可以帮助你避免基本的内存问题。

如何用自动引用计数来解决iPhone应用中的内存问题

编辑:

正如我们所知,苹果在IOS 5.0中引入了ARC,它是一个编译器级别的功能,简化了objective-c对象的生命周期过程。在ARC引入之前,我们手动管理内存,即“手动引用计数(MRC)”。使用MRC需要开发人员记住何时释放或保留对象。也就是说,开发人员需要管理objective-c对象的生命周期。

从开发者的角度来看,我们更关心向应用程序添加新功能,而不是专注于内存问题。但是,确保内存管理对应用程序成功至关重要。为了帮助开发人员,苹果找到了一种自动管理内存的方法。

ARC可以智能地管理内存,但这并非百分之百可靠。在开发过程中,我们需要注意一些细节,以避免应用程序出现内存不足的问题。下面我将尝试提供在基于ARC的应用程序中管理内存的解决方案。虽然这不能保证百分之百成功,但它可以帮助编译器估计objective对象的生命周期。

以下是你需要在每个控制器中实施的步骤:

第1步。 为应用程序中使用的每个UI控件声明弱引用属性。

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

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

第二步。根据我们的开发人员,最令人困惑的问题是编译器是否允许在基于ARC的应用程序中声明“dealloc”方法。答案是肯定的,但不允许在其中声明“[super dealloc]”。因此,请在每个控制器中重写“dealloc”方法。

-(void)dealloc{

}

第三步。 在“dealloc”方法中从父视图中移除重载对象,而不是仅仅设置“nil”引用,例如MKMapview、ScrollView等。

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

第四步:避免死锁机制。(例如:有A类和B类。B类被声明为具有“Strong”属性类型的Delegate,因此A类和B类相互依赖,在一个类被释放时,“dealloc”方法并不会被调用,因此该类保留在内存中。为了消除这种情况,我们需要将Delegate对象的引用设置为“Assign”。)这只是一个例子。我们还需要考虑其他方面,比如“为块保留弱引用,以便在执行完成后释放对象”。
这些是避免内存问题的基本步骤。如果仍然遇到内存问题,则需要使用分析器查找泄漏和内存使用情况。
以下链接将帮助您分析内存。 内存分析器

哦,我以为在ARC中dealloc不会自动调用。 - Zoeb S
dealloc 在 ARC 中也被调用。因此,将 nil 赋值给强引用变量。 - Jatin Patel - JP
@None - ARC自动处理强引用(和弱引用),这就是重点。没有必要使用dealloc将强引用变量设置为nil。因此,步骤3是多余的。 - CRD

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接