Objective c ARC在objectiveC中如何更改自动释放使用?(例如在描述方法中)

Objective c ARC在objectiveC中如何更改自动释放使用?(例如在描述方法中),objective-c,ios5,memory-management,Objective C,Ios5,Memory Management,从弧前思维的保留和释放,我试图在objectiveC中围绕弧 在弧前的日子里,任何返回新创建实例的方法都将使用自动释放池 - (NSString *)description { NSString *output = [NSString stringWithFormat:@"max size is: %d", maxSize]; return output; } 它是这个新创建的实例的任务的接收者来保留它 我很好奇。在ARC世界中,你能做到这一点吗 - (NSString

从弧前思维的保留和释放,我试图在objectiveC中围绕弧

在弧前的日子里,任何返回新创建实例的方法都将使用自动释放池

- (NSString *)description {
     NSString *output = [NSString stringWithFormat:@"max size is: %d", maxSize];
     return output;
 }
它是这个新创建的实例的任务的接收者来保留它

我很好奇。在ARC世界中,你能做到这一点吗

- (NSString *)description {
     NSString *description = [[NSString alloc] initWithFormat:@"max size is: %d", maxSize];
     return description;
}
这在技术上可行吗?这合乎逻辑吗? 我是说,感觉不对。它扰乱了计数,不是吗

我的问题也适用于不同的获得者。例如:

- (NSArray *)items {
    return [NSArray arrayWithArray:items];
}
可能是

- (NSArray *)items {
    return [[NSArray alloc] initWithArray:items];
}
我知道ARC为您添加了保留和释放消息。
我很想了解这在这些情况下是如何工作的。

您可以使用其中任何一种-这就是ARC的美妙之处。它跟踪来自项目的每个对象,并知道其是否已自动删除。所以是的,你可以混合。唯一的问题是,如果您编写一个库,您需要遵守命名约定,即init返回一个保留的对象。

您可以使用其中任何一个-这就是ARC的优点。它跟踪来自项目的每个对象,并知道其是否已自动删除。所以是的,你可以混合。唯一的问题是,如果您编写一个库,您需要遵守命名约定,即init返回一个保留的对象。

在这种情况下,像stringWithFormat这样的自动释放工厂方法的目的是什么?对于这些例子,你会使用哪种方法?它们现在只是历史性的-你可以使用其中的任何一种。请记住,许多人没有使用ARC,或者他们已经转换了旧代码,不想将所有旧方法都更改为一种类型。苹果在ARC上做得很好,所以你所有的旧代码都可以通过删除保留和发布来工作。我在商店的应用程序中使用了各种各样的方法,完全没有任何问题。也许几年后苹果就开始反对一些旧的方法,但为什么要这么做呢?保留它们的成本很低。库可能对这两种类型都很满意。@David:我想如果我用某物编译一个库函数
initWithSomething
,那么ARC编译器将创建返回保留对象的代码,这样命名约定也会自动执行。马丁:如果库也是用ARC编译的,这是真的。当你编写一个没有ARC的库,并从一个使用ARC编译的应用程序调用它时,你必须担心如何正确使用约定。在ARC管理对象时,不要做任何假设——这就是为什么苹果去掉了保留计数消息——他们不希望你试图猜测它们。当ARC控制事物时,苹果没有义务在任何时候做任何事情,除了确保对象在其应在范围内且有效时不会消失。如果可能的话,苹果将尽量避免使用自动释放,因为这会带来性能甚至内存开销。如果它可以创建,那么只需在这两个步骤中释放对象。在这种情况下,像stringWithFormat这样的自动释放工厂方法的目的是什么?对于这些例子,你会使用哪种方法?它们现在只是历史性的-你可以使用其中的任何一种。请记住,许多人没有使用ARC,或者他们已经转换了旧代码,不想将所有旧方法都更改为一种类型。苹果在ARC上做得很好,所以你所有的旧代码都可以通过删除保留和发布来工作。我在商店的应用程序中使用了各种各样的方法,完全没有任何问题。也许几年后苹果就开始反对一些旧的方法,但为什么要这么做呢?保留它们的成本很低。库可能对这两种类型都很满意。@David:我想如果我用某物编译一个库函数
initWithSomething
,那么ARC编译器将创建返回保留对象的代码,这样命名约定也会自动执行。马丁:如果库也是用ARC编译的,这是真的。当你编写一个没有ARC的库,并从一个使用ARC编译的应用程序调用它时,你必须担心如何正确使用约定。在ARC管理对象时,不要做任何假设——这就是为什么苹果去掉了保留计数消息——他们不希望你试图猜测它们。当ARC控制事物时,苹果没有义务在任何时候做任何事情,除了确保对象在其应在范围内且有效时不会消失。如果可能的话,苹果将尽量避免使用自动释放,因为这会带来性能甚至内存开销。如果它可以创建对象,那么只需在这两个步骤中释放对象。