iphone - 为什么要创建一个变量而不是直接赋值?

标签 iphone objective-c ios

这是一个基本问题,我不确定要搜索什么以查看以前是否有人问过它。

在很多示例中,我看到过这样处理属性分配:

NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];

为什么不这样做:

self.propertyArray = [/*some code to get array*/];

两者有什么区别?

最佳答案

此答案假设您不使用 ARC。

第一个代码片段是 Apple 推荐的初始化属性的方式,只要您在 init 之外的任何方法中执行此操作。您会注意到 Apple 代码片段经常这样做。它使您更容易管理您的内存,而且在我看来,它也更容易阅读。

NSArray *tempArray = [[NSArray alloc] initWith....]
self.propertyArray = tempArray;
[tempArray release];

根据您设置 NSArray 的方式,您拥有的第二个代码片段可能会导致内存泄漏。

这将是一个泄漏。 propertyArray 的保留计数为 2。在 dealloc 中释放实例变量后,保留计数仍然为 1。这是泄漏。

self.propertyArray = [[NSArray alloc] initWith...];

这没问题,因为它们都被自动释放,这将使您的保留计数为 1。只要您在 dealloc 中释放实例变量。

// Class Method so autoreleased
self.propertyArray = [NSArray arrayWith....];

// Explicitly declaring autorelease
self.propertyArray = [[[NSArray alloc] initWith.....] autorelease];

这只是一个偏好问题。我更喜欢第一种方式,我认为它更容易阅读和遵循。

编辑(使用 ARC):

除了 release 语句和 autorelease 语句外,所有这些方法都是可以接受的。

[tempArray release];

ARC 自动为您管理内存,因此您不必显式释放它们。这就是 ARC 的好处,您可以根据需要创建任意数量的对象,而无需为弄清楚在哪里释放它们而头疼。

此外,您的属性(property)也会有所不同。您必须使用强或弱,而不是保留。在这种情况下,强大的解决方案。

@property (nonatomic, strong) NSArray *tempArray;

关于iphone - 为什么要创建一个变量而不是直接赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269030/

相关文章:

ios - iPad 多任务处理的首选状态栏样式 - 分屏

iphone - 添加到主屏幕 - 图标上没有反光

iphone - NSData dataWithContentsOfURL 缓存

iphone - cocos2d位置坐标

iphone - 在 ios 7 的 xcode 4.6 中调整自定义导航栏

iphone - UIViewController View -> loadView 与 viewWillAppear

iphone - 以特定方法访问NSManagedObjects时,应用程序崩溃

ios - 如果用户在 iOS Swift 中登录,则从某个 View 开始

ios - 暂停 SKSpriteNode (Swift, SpriteKite)

iphone - 我如何测试某个表格 View 单元格是否具有特定图像?