objective-c - 如何正确设置 Objective-C 中的属性值

标签 objective-c memory-management

我可能进入 Objective-C 的速度有点太快了,并以为我对内存管理有足够的了解,可以深入研究。事实证明我不是。

快进一点,我已经 catch 了......大部分。我最后剩下的问题之一是关于 @property/@synthesize 过程以及正确设置这些值。

我经常看到这样的情况:

SomeObject *obj = [[SomeObject alloc] init];
self.obj = obj;
[obj release];

这是有道理的,但我想知道这是否能完成足够类似的事情来作为替代方案:

self.obj = [[[SomeObject alloc] init] autorelease];

在您可以设置 @property 值的任何地方,这是否可以接受? , obj ?或者直接访问实例变量优于 init 中的两者方法?

obj = [[SomeObject alloc] init];

谢谢。

编辑:绝对相关question这讨论了我问题的一半。 autorelease我的问题的一部分在其中一个答案中引用,但尚未得到证实。

所以我的问题仍然存在:

  1. autorelease在这种情况下有一个有效的替代方案吗?
  2. 可以autoreleaseinit 中以这种方式使用方法,或者应该始终直接在 init 中设置实例变量方法?

最佳答案

唯一的区别是,在第一个示例中,obj 立即释放(尽管它可能由 self.obj setter 保留)。这两个示例实际上是相同的。

请注意,接下来,我们可以依靠 ARC 来处理在适当的时间释放对象,因此您可以编写:

self.obj = [[SomeObject alloc] init];

让 ARC 关心将发布或自动发布放在哪里。

更新:您似乎在问 -init 方法内部的情况有何不同。您需要注意的两件事是:

  1. 如果可能,您应该直接在 -init-dealloc 方法中访问 ivars。这个想法是为了避免如果您的访问器被子类覆盖则可能出现的问题。这里还有许多关于 SO 的其他问题可以更深入地解决这个问题,例如:

    Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

  2. 如果您在 -init 方法中创建一个对象并将其分配给 ivar,那么您可能不想在以后再释放它,例如 -dealloc。所以,是的,在 -init 方法中不释放您创建的对象(只要您保留对它们的引用)就可以了,但您仍然可以平衡 +alloc code> 与 -dealloc 中的 -release

关于objective-c - 如何正确设置 Objective-C 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496763/

相关文章:

iphone - CLLocationManager 没有获取城市名称

iphone - 更改 UISegmentedControl 的选定段

objective-c - 关于 subview 在 objective-C 中保留 superview 的问题

iphone - 有办法到达 "find mystery retains"...吗?

objective-c - 何时使用-retainCount?

ios - UIImagePickerController + 裁剪 : what does allowEditing and what does it not?

objective-c - NSStackView 只显示最新的自定义 View

objective-c - 从日历存储中删除对象。

c++ - 指针释放和堆内存,c++

c++ - 堆上的类内的 Linux fork