Objective c 目标C——编写简单方法的最佳实践?

Objective c 目标C——编写简单方法的最佳实践?,objective-c,function,Objective C,Function,在以下功能中,哪一个是最佳实践 发送一个自动释放的对象,并让调用者保留它 或者发送一个已分配的对象,并让调用者释放它 -(NSString*)convertDataToString:(NSData*)myData { //仅举一个例子,方法可能不存在 NSString*str=[[NSString alloc]initWithData:myData]; 返回str; 返回[str自动释放]; } 大多数情况下,您都希望返回自动释放的对象。 除非您的方法名称包含以下单词之一[alloc,new,

在以下功能中,哪一个是最佳实践

  • 发送一个自动释放的对象,并让调用者保留它

  • 或者发送一个已分配的对象,并让调用者释放它


  • -(NSString*)convertDataToString:(NSData*)myData {
    //仅举一个例子,方法可能不存在 NSString*str=[[NSString alloc]initWithData:myData]; 返回str; 返回[str自动释放]; }
    大多数情况下,您都希望返回自动释放的对象
    除非您的方法名称包含以下单词之一[alloc,new,copy],否则您应该返回自动释放的对象。

    我更喜欢返回自动释放。这意味着您没有四处寻找内存被释放的位置。将内存分配和释放保持在一起可以让您的生活更轻松。毕竟,你在编写代码,为什么要让自己更难呢。

    假设你的第一个示例是错误的,这是一个直接引用。这甚至不是偏好的问题,这里的一些答案似乎表明了这一点。调用者通常不拥有您返回的对象,因此应该自动删除它

    规则中的具体示例如下所示:

    这是错误的。遵循所有权策略,将导致内存泄漏

    对象对新阵列对象的引用仅限于链轮方法。方法返回后,对象将丢失对新对象的引用,因此无法放弃所有权。这本身不是问题。但是,按照前面列出的命名约定,调用方没有得到它拥有返回对象的指示。因此,调用方不会放弃返回对象的所有权,从而导致内存泄漏


    这两种方法都是可以接受的,但是您应该相应地命名您的方法:如果调用方有责任取消分配它,那么您必须通过让您的方法名称包含“create”、“alloc”或“copy”来明确这一点,否则不应该。 更多关于这个的阅读


    返回自动释放对象可能更为常见,但两者都可以。

    在@Chuck的评论之后,
    -convertDataToString不能返回调用者必须释放的对象。这将违反法律。如果您的名字中没有“copy”、“alloc”或“new”,则不能期望调用方释放该对象。如果名称中有“copy”或以“new”或“alloc”开头,则调用方必须释放该对象


    Objective-C在很大程度上依赖于一致的命名,而这些命名意味着事物。如果你学会了命名,那么你就不会有任何问题。

    如果你创建、分配或复制一个对象,你有责任释放它。基于此,您应该返回一个自动释放的对象。

    我刚刚开始目标C,这是一个很好的问题!我不确定它是否只是为了举例,但是
    NSString
    没有
    initWithData:
    方法,而是
    initWithData:encoding:
    方法。“//只是一个例子,方法可能不存在”:)我在评论中有它哦,哈哈,我认为这是针对
    convertDataToString:
    方法的。您不应该将这些词添加到任意方法名称中作为忽略内存管理规则的借口
    alloc
    copy
    具有特定含义。如果您没有执行
    alloc
    copy
    的工作,则不应在选择器中使用该选项。“创建”不是Cocoa规则的一部分。这是核心基金“创建规则”的一部分。在核心基础上,“复制”和“创造”是可可中的“新”、“异类”和“复制”。在可可方法中,我通常避免“创建”一词来防止混淆。在我生活的托管c#世界中,约定是存在的,但它是一种精确的约定(除了asp.net mvc之外)。在objective-c中,它似乎实际上是机器中的一个齿轮。嗨,Rob,这是否意味着如果函数名为newStringFromData,我们可以期望调用方在使用对象后释放该对象。@Krishnan,对于该方法,我们期望调用方处理一个额外的保留。调用者可能是也可能不是释放对象的人(他可能被称为newStringFromSomethingElse:)。但关键是,当我们归还物品时,应该会有一个多余的保留。谢谢Rob。。这回答了我的问题。 - (NSString*) convertDataToString :(NSData*)myData { //just an example, method might not exist NSString *str = [[NSString alloc] initWithData:myData]; return str; return [str autoRelease]; }
     – (NSArray *)sprockets {
    
        NSArray *array = [[NSArray alloc] initWithObjects:mainSprocket,
                                   auxiliarySprocket, nil];
        return array;
    }