创建新实例的类方法

pis*_*hio 20 memory-management objective-c initializer class-method

除了标准[[MyClass alloc] init]模式,一些对象是由静态方法构建的MyClass *obj = [MyClass classWithString:@"blabla"]

根据广泛的内存管理指南(包括Apple的),您只负责释放您的对象alloc.

有人能为我提供这种方法的模板吗?你如何返回分配的对象([self alloc]; return self;也许)?你如何确保它将被释放?

Jos*_*ell 48

它们是类方法,而不是静态方法1.这种创建自动释放对象的特定类型可以称为"工厂方法"(以前也称为"便利构造函数"),它们在ObjC指南概念中讨论.它们是这样的:

+ (instancetype)whatsisWithThingummy: (Thingummy *)theThingummy {
    return [[self alloc] initWithThingummy:theThingummy];
}
Run Code Online (Sandbox Code Playgroud)

Whatsis你的班级在哪里,Thingummy是你班级使用的另一个班级.

如果您没有使用ARC进行编译,那么autorelease在返回之前,约定就是实例.

instancetype关键字被锵对这类方法的介绍; 结合self(在类方法中是类对象本身2)它允许正确的子类行为:该方法产生接收消息的类的实例.3 instancetype允许编译器进行更严格的类型检查id.

从框架中对子类中的这种用法进行说明:+[NSString stringWithFormat:]返回一个NSString实例,而+[NSMutableString stringWithFormat:]返回一个子类的实例NSMutableString,而不NSMutableString需要显式覆盖该方法.

正如[ Fundamentals ] [1] doc 所讨论的那样,这些工厂方法还有其他用途,例如访问单例,或者在执行之前评估必要的内存分配(可能,但不太方便,使用标准alloc/ init对) .


1 Java或C++中的"静态方法",Objective-C中的"类方法".在ObjC中没有静态方法这样的东西

2在实例方法self中,合理地,是对实例的引用.

3以前,与通常的初始化方法(initWith...)一样,您将使用id返回类型.使用特定的类名称会不必要地强制子类覆盖该方法.

  • "id"为+1,返回类型为+1,文档引用为+1,类方法为+1,便捷构造函数为+1. (6认同)