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)相结合,它允许正确的子类行为:该方法生成接收消息的类的实例。3
instancetype
允许编译器执行比
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对象,调用者应该拥有该对象。但这不是必需的,因为默认的自动释放实现将得到相同的结果。