Objective c 目标C静态与动态构造函数

Objective c 目标C静态与动态构造函数,objective-c,static,constructor,Objective C,Static,Constructor,最好使用静态构造函数在构造函数中分配实例,并将实例作为自动释放返回,例如[String stringWithFormat…],还是最好使用动态构造函数,要求用户首先分配实例,以便他负责释放?什么时候使用 干杯首先,Objective-C中没有构造函数,也没有静态和动态构造函数。你得到了C++污点,它妨碍了你理解ObjuleC的能力:p> 你会想再读一遍 特别是针对您的问题,如果您有类方法,比如+stringWithFormat:,那么该方法应该返回一个自动释放的实例。一般来说,它的实施方式如下:

最好使用静态构造函数在构造函数中分配实例,并将实例作为自动释放返回,例如[String stringWithFormat…],还是最好使用动态构造函数,要求用户首先分配实例,以便他负责释放?什么时候使用


干杯首先,Objective-C中没有构造函数,也没有静态和动态构造函数。你得到了C++污点,它妨碍了你理解ObjuleC的能力:p> 你会想再读一遍

特别是针对您的问题,如果您有类方法,比如+stringWithFormat:,那么该方法应该返回一个自动释放的实例。一般来说,它的实施方式如下:

+ stringWithFoo: (Foo *) aFoo
{
     return [[[self alloc] initWithFoo: aFoo] autorelease];
}

稍微简化以避免varargs噪声。

首先,Objective-C中没有构造函数。也没有静态和动态构造函数。你得到了C++污点,它妨碍了你理解ObjuleC的能力:p> 你会想再读一遍

特别是针对您的问题,如果您有类方法,比如+stringWithFormat:,那么该方法应该返回一个自动释放的实例。一般来说,它的实施方式如下:

+ stringWithFoo: (Foo *) aFoo
{
     return [[[self alloc] initWithFoo: aFoo] autorelease];
}

稍微简化以避免varargs噪声。

我不确定“静态”和“动态”是否是合适的术语

[NSString stringWithFormat:…]是一种方便的方法。如果您想要一个格式化的字符串,而不想保留很长时间,那么可以使用这个方便的方法来避免alloc+initWithFormat:+release可能会给您的[否则很简单]代码带来的混乱

[[NSString alloc]initWithFormat:…]有时对读者来说更清楚,这个对象的生存期将被显式处理,即在以后的版本中,尽管我发现在某些地方遇到[[NSString alloc]initWithFormat:…]自动释放]并不罕见

在设计类时,您应该确定类的实例是否打算频繁/快速使用,而不是长期使用,或者两者兼而有之。如果您认为您的类可以频繁地或快速地使用,那么提供便利方法将有助于减少混乱和简化使用类的代码。
例如,不是一个您经常创建和删除其实例的类,因此没有方便的方法来创建NSWindow实例,您必须通过alloc+init路径事实上,NSWindow通常不是一个您必须手动创建其实例的类。另一方面,字符串、数组、字典、集合等等,这些都是经常被创建和丢弃的东西,因此它们都有方便的方法,使创建和管理它们变得更容易。

我不确定“静态”和“动态”是否是合适的术语

[NSString stringWithFormat:…]是一种方便的方法。如果您想要一个格式化的字符串,而不想保留很长时间,那么可以使用这个方便的方法来避免alloc+initWithFormat:+release可能会给您的[否则很简单]代码带来的混乱

[[NSString alloc]initWithFormat:…]有时对读者来说更清楚,这个对象的生存期将被显式处理,即在以后的版本中,尽管我发现在某些地方遇到[[NSString alloc]initWithFormat:…]自动释放]并不罕见

在设计类时,您应该确定类的实例是否打算频繁/快速使用,而不是长期使用,或者两者兼而有之。如果您认为您的类可以频繁地或快速地使用,那么提供便利方法将有助于减少混乱和简化使用类的代码。
例如,不是一个您经常创建和删除其实例的类,因此没有方便的方法来创建NSWindow实例,您必须通过alloc+init路径事实上,NSWindow通常不是一个您必须手动创建其实例的类。另一方面,字符串、数组、字典、集合等等,这些都是经常创建和丢弃的东西,因此它们都有方便的方法,使创建和管理它们更容易。

非常感谢。没错,我是一个新的C++程序员,有C++思维。非常感谢。没错,我是一个新的C++程序员,有C++思维。