objective-c - 创建新实例的类方法

标签 objective-c memory-management class-method initializer

除了标准的 [[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/

相关文章:

c++ - 指针还是数组?

c# - 空指针使用多少内存?

ios - 加速度计的性能问题

ruby-on-rails - 使用符号输入调用类方法

objective-c - 像 iOS 邮件应用程序一样缩放 UIWebView

ios - 将 CLLocationCoordinate2D 发送到不兼容类型的参数我在 Xcode 4.5 中的代码

objective-c - 如何使用 viaPoints 数组计算路线

python - 在创建 Python 类时调用类方法

自定义 S4 类的 R 绘图方法

iphone - 初始化后如何将 NSManagedObject 关联到上下文?