除了标准的 [[MyClass alloc] init]
模式,一些对象是从静态方法构建的,比如 MyClass *obj = [MyClass classWithString:@"blabla"]
根据广泛使用的内存管理指南(包括 Apple 的指南),您只需负责释放您分配
的对象。
任何人都可以为我提供此类方法的模板吗?如何返回分配的对象([self alloc]; return self;
,也许)?你如何确保它会被发布?
最佳答案
它们是类方法,不是静态方法1。这种创建自动释放对象的特定类型可以称为“工厂方法”(以前也称为“便利构造函数”),它们在 the Concepts in ObjC Guide 中进行了讨论。 .他们是这样的:
+ (instancetype)whatsisWithThingummy: (Thingummy *)theThingummy {
return [[self alloc] initWithThingummy:theThingummy];
}
Whatsis
是您的类(class),Thingummy
是您类(class)使用的另一个类(class)。
如果您不使用 ARC 进行编译,惯例是在返回实例之前自动释放
实例。
instancetype
keyword由 Clang 为这些方法引入;结合 self
(它是类方法中的 class object 本身 2),它允许正确的子类行为:该方法生成接收消息的类的实例。 3 instancetype
允许编译器进行比 id
更严格的类型检查。
框架子类中这种用法的说明:+[NSString stringWithFormat:]
返回一个 NSString
实例,而 +[NSMutableString stringWithFormat:]
,返回子类 NSMutableString
的实例,不需要 NSMutableString
显式覆盖该方法。
正如 [Fundamentals][1] 文档所讨论的,这些工厂方法还有其他用途,例如访问单例,或在执行之前评估必要的内存分配(可能,但使用标准的 alloc
/init
对不太方便。
1Java 或 C++ 中的“静态方法”,"class methods"在 Objective-C 中。 There's no such thing as static methods in ObjC
2而在实例方法中,self
显然是对实例的引用。
3之前,like the usual initialization methods (initWith...
),您会使用 id
作为返回类型。使用特定的类名会不必要地强制子类覆盖该方法。
关于objective-c - 创建新实例的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5987969/