gpt4 book ai didi

objective-c - 澄清 objective c 对象的一般自定义初始化方法/指针

转载 作者:行者123 更新时间:2023-12-04 02:54:03 25 4
gpt4 key购买 nike

当我有自己的具有合成属性的 init 方法时:

@property (copy, nonatomic)   NSString       *bookName;
@property (strong, nonatomic) NSMutableArray *book;

当我想用我自己的自定义初始化程序进行初始化时,我被证明是这样写的:

-(id) initWithName: (NSString *)name
{
self = [super init]
if (self) {
bookName = [NSString stringWithString: name];
book = [NSMutableArray array];
}
return self;
}

现在我想澄清一件事。我知道它为什么使用 stringWithString 方法,因为它不只是将地址传递给传入的字符串,而是创建一个新对象,以便它拥有字符串本身。我能不能也这样写:

self.bookName = name;

这样做应该使用合成方法并实际创建一个新对象吧?基本上两者都完成了同样的事情。我问是因为还有其他方法表明可以两种方式进行操作,所以我只想确保使用一种或另一种方式不会出现其他问题。他们似乎都以不同的方式做同样的事情(使用合成方法与直接修改类变量但在内存中为其创建一个新对象)。

我还要指出这是在 ARC 环境中。

最佳答案

(请注意,我假设以上是 ARC 代码;否则它是不正确的。)

您应该几乎总是使用访问器来访问您的 ivar(即使在 ARC 中)。然而,关于 init 应该使用访问器还是直接访问其 ivars 存在一些争议。我在这场争论中改变了立场,但这不是 IMO 的明显决定。

不允许 init 使用访问器的主要论点是, future 的(未知)子类可能会在访问器中产生副作用。您通常不希望在 init 期间发生副作用。例如,当您将某些东西设置为初始值时,您可能不想发布更改通知,并且您的对象可能处于“未定义状态”并且此时读取是危险的。

也就是说,虽然这个论点最终影响了我,但我从未在多个团队的许多不同规模的项目中遇到过这种情况。我曾多次遇到开发人员在 init 中设置他们的 ivars 时未能retain(正如您在上面所做的,如果不是 ARC 则会崩溃)。这就是为什么很长一段时间我都建议在 init 中使用访问器。但从理论上讲,它确实会产生危险,特别是如果您是闭源框架编写者(即 Apple)。因此,对于我自己的代码,我现在避免在 init 中使用访问器。如果我与更初级的团队合作处理较旧的保留/发布代码,我可能仍会让他们在 init 中使用访问器。根据我的经验,它只是避免了很多崩溃。

然而,您应该避免在 dealloc 中调用访问器这一点没有争议。这肯定会在破坏对象的过程中导致奇怪的副作用。

关于objective-c - 澄清 objective c 对象的一般自定义初始化方法/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9918300/

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