Objective c 类创建新实例的方法
除了标准的Objective c 类创建新实例的方法,objective-c,memory-management,class-method,initializer,Objective C,Memory Management,Class Method,Initializer,除了标准的[[MyClass alloc]init]模式之外,有些对象是从静态方法构建的,比如MyClass*obj=[MyClass classWithString:@“blablabla”] 根据广泛使用的内存管理指南(包括苹果的),你只负责释放你alloc的对象 有人能为我提供这样的方法的模板吗?如何返回分配的对象([self alloc];可能返回self;)?如何确保将其释放?从factory方法返回的对象应该自动释放,这意味着当关联的自动释放池耗尽时,它们将被清除。这意味着您不拥有返
[[MyClass alloc]init]
模式之外,有些对象是从静态方法构建的,比如MyClass*obj=[MyClass classWithString:@“blablabla”]
根据广泛使用的内存管理指南(包括苹果的),你只负责释放你alloc
的对象
有人能为我提供这样的方法的模板吗?如何返回分配的对象(
[self alloc];可能返回self;
)?如何确保将其释放?从factory方法返回的对象应该自动释放,这意味着当关联的自动释放池耗尽时,它们将被清除。这意味着您不拥有返回的对象,除非您复制
或保留它们。以下是工厂方法的示例:
+ (id)myClassWithString:(NSString *)string {
return [[[MyClass alloc] initWithString:string] autorelease];
}
它们是类方法,而不是静态方法1。创建自动释放对象的这种特定类型可以称为“工厂方法”(以前也称为“便利构造函数”),这些方法将在中讨论。它们是这样的:
+ (instancetype)whatsisWithThingummy: (Thingummy *)theThingummy {
return [[self alloc] initWithThingummy:theThingummy];
}
其中,Whatsis
是您的类,thingumy
是您的类使用的另一个类
如果您不是使用ARC编译,惯例是在返回实例之前自动释放实例
针对这些方法,Clang引入了新的方法;与self
(类方法中的itself2)相结合,它允许正确的子类行为:该方法生成接收消息的类的实例。3instancetype
允许编译器执行比id
更严格的类型检查
此用法在框架子类中的示例:+[nsstringwithformat:
返回一个NSString
实例,而+[nsmutablestringwithformat:
返回子类NSMutableString
的实例,无需使用NSMutableString
显式重写该方法
正如[基础知识][1]文档所讨论的,这些工厂方法还有其他用途,例如访问单例,或在执行之前评估必要的内存分配(可能,但不太方便,使用标准的alloc
/init
对)
C++中的1种静态方法,Objtovi-C.<
2而在实例中,方法self
是对实例的合理引用
3先前(initWith…
),您应该使用id
作为返回类型。使用特定的类名不必要地强制子类重写该方法。这些方法只是返回对象的自动删除版本
+(MyClass*)class
{
MyClass* object = [[MyClass alloc] init];
return [object autorelease];
}
使用ARC和最新编译器执行此操作的现代方法是:
+ (instancetype) myClassWithString:(NSString *)string {
return [[MyClass alloc] initWithString:string];
}
- 无需使用ARC自动释放
- 提供更好的编译时检查,同时使子类化成为可能
由于继承,工厂方法通常将id
作为返回类型。不仅+alloc
-名称以alloc
开头的任何方法,new
,copy
,mutableCopy
,以及-retain
+1作为返回类型,+1作为文档引用,类方法+1,方便构造函数+1。@bavaried:谢谢。我很高兴你没有为糟糕的元语法变量扣分。:)+1脚注中提到了Clang的instancetype
扩展名。+1,尽管我不得不克制自己编辑元语法变量。@Josh:“以前,像通常的初始化方法(initWith…)一样,您会使用id作为返回类型。”。当未作为类方法的一部分合并时,id是否仍然用作-initWith样式的实例方法的返回类型?使用ARC时是否使用autorelease
应用?@SAFX,否,您可以查看apple的注释:重命名方法以单词“new”开头或使用NS_RETURNS_RETAINED属性宏不是更好吗?据我所知,这样做告诉ARC它接收到一个+1对象,调用者应该拥有该对象。但这不是必需的,因为默认的自动释放实现将得到相同的结果。