gpt4 book ai didi

objective-c - Objective C 类初始化

转载 作者:行者123 更新时间:2023-12-03 17:28:51 25 4
gpt4 key购买 nike

+ (id)packetWithType:(PacketType)packetType
{
return [[[self class] alloc] initWithType:packetType];
}

- (id)initWithType:(PacketType)packetType
{
if ((self = [super init]))
{
// code
}
return self;
}

为什么我们需要第一个类方法,第二个类方法不足以初始化吗?

最佳答案

使用方便的构造函数类方法有两个原因。第一个是,[[Thing alloc] initWithFoo: xyz] 的习惯用法确实很常见,但在任何地方键入都很不方便。因此,[Thing thingWithFoo: xzy] 是一个常见的缩写。

更深层次的原因与引用计数有关。以 init 开头的方法应该返回实例的引用,该实例的所有权转移给调用者。而便利类方法通常返回 autoreleased 引用:

+ (id)packetWithType:(PacketType)packetType
{
return [[[[self class] alloc] initWithType:packetType] autorelease];
}

为了避免悬空引用和/或内存泄漏,了解这一点很重要:

Thing* thing = [[Thing alloc] initWithFoo: xyz];
// Now, *I* own the reference and *I* am responsible for releasing
// it, when I no longer need it.
[thing release]

另一方面,返回的引用

Thing* thing = [Thing thingWithFoo: xyz];

由“最近的”NSAutoreleasePool 拥有。调用者不负责释放它(事实上,这是错误的!)。如果要保留引用,调用者实际上必须在此处保留它:

self->myMember = [thing retain];

即使在使用 ARC 时,您也应该了解这些约定,因为基本规则仍然有效,即使(在 ARC 下)是编译器生成遵守这些约定的代码。 NARC 首字母缩略词是一个很好的内存方法,它的方法名称前缀具有特定的职责。 This answer has the details .

关于objective-c - Objective C 类初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15382261/

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