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返回类型.使用特定的类名称会不必要地强制子类覆盖该方法.