【问题标题】:Class method to return autoreleased object返回自动释放对象的类方法
【发布时间】:2011-06-23 12:50:43
【问题描述】:

我一直在关注 iTunes U 上的 iPhone 开发视频,到目前为止一切都很好。我想我对事情的理解已经足够好了。

问题是,在他们提供的示例中,他们从不创建自定义类方法,就像您在某些 Foundation 类(如 [NSString string])上使用的那些方法,所以我不确定应该如何创建我的自己的类方法来返回我的类的自动释放实例。

我确实知道如何使用实例方法创建保留对象,但我更喜欢使用类方法,因为我更喜欢它,我只是不确定此实现是否最适合返回自动释放对象:

+ (PhotoViewController*)initWithImageView:(UIImageView*)imageView
{
    PhotoViewController *toreturn = [[PhotoViewController alloc] init];
    toreturn.imageview = imageView;
    [toreturn autorelease];
    return toreturn;
}

非常感谢您提供的任何帮助。

【问题讨论】:

    标签: iphone objective-c memory-management class-method


    【解决方案1】:

    类方法可以根据需要返回保留或自动释放的对象,并且您的代码完美地返回自动释放的对象。

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

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

    【讨论】:

    • 我认为他是在问他是否使用了保留释放权,而您似乎回答了除此之外的所有问题 :)
    • 类方法根本不应该以init 为前缀,但Apple 的指导方针只涵盖以allocnew 开头或包含单词copy 的方法名称。
    • 你说的很对,谢谢!我会相应地修改我的答案。
    • 非常感谢您的意见。我也喜欢遵循约定(它们似乎在内存管理这个领域很重要)所以你关于方法名称的建议很重要,因为我不知道。
    • 从类构造函数返回自动释放对象的标准应该是“clasaNameInitializer”的形式。所以在你的例子中它应该看起来像 +(PhotoViewController*)photoViewControllerWithImageView:(UIImageView*)imageView;
    【解决方案2】:

    我认为在访问imageview 属性之前检查toreturn 是否为nil 是一个好习惯。

    【讨论】:

    • 为什么在这种情况下会有任何不同?
    • 不,不会。但我的经验表明,最好在代码中明确返回值是什么,尤其是代码将在很久以后维护,可能由其他人维护。但其他人可能不同意。抱歉,我在答案中并不清楚。
    • 仍然不清楚你在这里得到了什么。如果对init 的调用失败,则该方法应返回nil。你会有什么不同的做法?
    • 对我来说,这是对联合程序员(或未来的我)的提醒,init 的返回可能是nil,因为在这个函数中添加了一些东西。好吧...如果项目仅适用于 Objective-C,也许完全没有必要。这样做是我的习惯,感谢您给我机会重新考虑。
    • 我理解你所说的使用额外代码来提高可读性的意思,但你能详细说明一下 init 怎么会失败(如果你的内存用完了?)?
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多