返回自动释放对象的类方法

3
我一直在iTunes U上跟进iPhone开发视频,目前为止一切顺利。我认为我已经足够理解了。
问题是,他们提供的示例从未创建过自定义类方法,就像您在某些Foundation类(如[NSString string])中使用的那些方法一样,因此我不确定应该如何创建自己的类方法来返回一个autoreleased实例。
我知道如何使用实例方法创建保留对象,但我更愿意使用类方法,只是不确定这种实现是否最合适以返回autoreleased对象。
+ (PhotoViewController*)initWithImageView:(UIImageView*)imageView
{
    PhotoViewController *toreturn = [[PhotoViewController alloc] init];
    toreturn.imageview = imageView;
    [toreturn autorelease];
    return toreturn;
}

非常感谢您提供的任何帮助。
2个回答

6

一个类方法可以根据您的意愿返回保留或自动释放的对象,您的代码完全适当地返回了一个自动释放的对象。

然而,您可能应该给您的方法起一个不同的名称。由于您的方法以init开头,这意味着它正在初始化一个alloc的对象(因此应该是实例方法而不是类方法)。如果它要返回一个自动释放的对象,我建议将该方法命名为photoViewControllerWithImageView:

另外,我可能会将其写成return [toreturn autorelease];,但我想这只是我的风格偏好。


我认为他在问他是否正确地使用了保留释放(retain-release),而你似乎回答了除了这个问题之外的所有问题 :) - Nikita Rybak
2
类方法根本不应该以“init”为前缀,但是苹果的指南只涵盖以“alloc”或“new”开头或包含单词“copy”的方法名称。 - jlehr
你说得很对,谢谢!我会相应修改我的回答。 - paulbailey
非常感谢您的输入。我也喜欢遵循惯例(在内存管理领域似乎很重要),所以您关于方法名称的建议很重要,因为我之前并不知道。 - João Josézinho
从类构造函数返回自动释放对象的标准应该是“clasaNameInitializer”形式。因此,在您的示例中,它应该像这样:+(PhotoViewController*)photoViewControllerWithImageView:(UIImageView*)imageView; - LightningStryk

2

在访问imageview属性之前,检查toreturn是否为nil是一个好的实践。


1
在这种情况下,为什么会有任何区别呢? - jlehr
不会的。但是我的经验告诉我,在代码中清楚地说明返回值是什么会更好,特别是当代码在以后很长时间内可能由其他人维护时。但是其他人可能不同意。对于我的回答没有表述清楚,我感到抱歉。 - MHC
仍然不清楚你在这里想表达什么。如果调用 init 失败,该方法会返回应该返回的 nil。你会有什么不同的做法吗? - jlehr
对我来说,这是提醒共同编程者(或未来的我)init 的返回值可能是 nil,当在此函数中添加某些内容时。嗯...如果该项目仅针对Objective-C,则可能完全不必要。但这就像我的习惯一样,感谢你给我机会再次考虑它。 - MHC
我明白你的意思是使用额外的代码使可读性更容易,但是你能详细说明一下init如何会失败(如果内存不足)吗? - João Josézinho
好的,我现在明白了(一个人可以实现自己的init方法)。 - João Josézinho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接