gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:04:42 24 4
gpt4 key购买 nike

我可能进入 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我的问题的一部分在其中一个答案中被引用,但尚未得到证实。

所以我的问题仍然存在:
  • autorelease在这种情况下有效的替代方案?
  • 可以 autoreleaseinit 中以这种方式使用方法,还是应该始终直接在 init 中设置实例变量方法?
  • 最佳答案

    唯一的区别是在您的第一个示例中,obj立即释放(尽管它可能被 self.obj setter 保留)。这两个例子实际上是相同的。
    注意,往后,我们可以依靠 ARC 来处理在适当的时候释放对象,所以你可以这样写:

    self.obj = [[SomeObject alloc] init];
    并让 ARC 担心将 release 或 autorelease 放在哪里。
    更新:您似乎在问 -init 内部的情况有何不同方法。您需要注意的两件事是:
  • 如果可能,您应该直接在 -init 中访问 ivars和 -dealloc方法。这个想法是为了避免在您的访问器被子类覆盖时可能发生的问题。 SO 上还有许多其他问题可以更深入地解决这个问题,例如:
    Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
  • 如果您在 -init 中创建对象方法并将其分配给 ivar,您可能不想在稍后释放它,例如 -dealloc .所以是的,在 -init 中没问题方法不释放您创建的对象(只要您保留对它们的引用),但您仍然会平衡 +alloc-release-dealloc .
  • 关于objective-c - 如何以正确的方式在 Objective-C 中设置属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496763/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com