Iphone 如何引用自动释放池中的对象?

Iphone 如何引用自动释放池中的对象?,iphone,cocoa-touch,memory-management,autorelease,Iphone,Cocoa Touch,Memory Management,Autorelease,我想知道自动释放池是否包含对它所包含的对象的强引用或弱引用。我猜他们是软弱的。当我将一个对象添加到自动释放池中时,它不会立即被释放,而是会在池中的水排干后被释放,对吗?因此,引用应该很弱,即当我向自动释放池添加对象时,引用计数(或保留计数)保持不变?是。retain count保持不变,您可以检查它是否为: id obj = [[NSObject alloc]init]; NSLog([NSString stringWithFormat: @"%d", [obj retainCount]

我想知道自动释放池是否包含对它所包含的对象的强引用或弱引用。我猜他们是软弱的。当我将一个对象添加到自动释放池中时,它不会立即被释放,而是会在池中的水排干后被释放,对吗?因此,引用应该很弱,即当我向自动释放池添加对象时,引用计数(或保留计数)保持不变?

是。retain count保持不变,您可以检查它是否为:

id obj = [[NSObject alloc]init];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
    [obj autorelease];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);

对。retain count保持不变,您可以检查它是否为:

id obj = [[NSObject alloc]init];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
    [obj autorelease];
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);

自动释放池的全部要点在于它是一个延迟发布。例如,您可以对将在方法中返回的本地对象调用autorelease,这样即使在方法返回时丢失了对该对象的引用,也可以释放该对象。

autorelease池的全部要点在于它是延迟释放。例如,您可以对将在方法中返回的本地对象调用autorelease,这样即使在方法返回时丢失了对该对象的引用,也可以释放该对象。

在垃圾收集内存管理环境中,谈论强引用和弱引用是有意义的在启用GC的情况下,所有保留/释放/自动释放调用基本上都是不执行任何操作(尽管NSAutoreleasePool-drain方法触发垃圾收集)

既然您已经将这个问题标记为与iPhone相关,并且iPhone上没有垃圾收集,我假设您指的是常规引用计数,强表示增加引用对象的保留计数,弱表示只存储指针值

autorelease
方法实质上是将对象的所有权从调用代码移动到当前的autorelease池,您可以考虑调用代码调用release和池调用retain


因此,引用实际上是强引用,但您的代码将失去所有权和发布责任。当释放/耗尽自动释放池时,将调用对象
release

在垃圾收集内存管理环境中,谈论强引用和弱引用是有意义的在启用GC的情况下,所有保留/释放/自动释放调用基本上都是不执行任何操作(尽管NSAutoreleasePool-drain方法触发垃圾收集)

既然您已经将这个问题标记为与iPhone相关,并且iPhone上没有垃圾收集,我假设您指的是常规引用计数,强表示增加引用对象的保留计数,弱表示只存储指针值

autorelease
方法实质上是将对象的所有权从调用代码移动到当前的autorelease池,您可以考虑调用代码调用release和池调用retain


因此,引用实际上很强,但您的代码失去了所有权和发布责任。当自动释放池被释放/耗尽时,将调用Object
release

保留计数保持不变,基本上对对象触发自动释放消息使开发人员不再拥有所有权和发布权限责任感

这就是自动释放池的工作原理-
每次创建autorelease池的实例时,它都会添加到堆栈的顶部,因此系统将使用最新的autorelease池。无论何时在autorelease池中添加任何对象,它都会添加到堆栈的顶部autorelease池。autorelease池基本上是添加autorelease对象的数组。E当特定的自动释放池被释放时,自动释放池中添加的每个对象都会被释放(/drained)。在系统开始处理任何事件之前,首先创建自动释放池,并将其保留在那里,直到当前事件循环的执行结束。当系统看到当前事件循环完成时,它将获得与该事件循环关联的最顶层自动释放池并将其释放。释放自动释放池/释放意味着将每个对象添加到自动释放池中,并在对象上触发一条释放消息,直到自动释放池中的所有对象都被释放。

保留计数保持不变,基本上在对象上触发一条自动释放消息使开发人员不再拥有所有权和释放责任

这就是自动释放池的工作原理- 每次创建autorelease池的实例时,它都会添加到堆栈的顶部,因此系统将使用最新的autorelease池。无论何时在autorelease池中添加任何对象,它都会添加到堆栈的顶部autorelease池。autorelease池基本上是添加autorelease对象的数组。E当特定的自动释放池被释放时,自动释放池中添加的每个对象都会被释放(/drained)。在系统开始处理任何事件之前,首先创建自动释放池,并将其保留在那里,直到当前事件循环的执行结束。当系统看到当前事件循环完成时,它将获得与该事件循环关联的最顶层自动释放池并将其释放。释放自动释放池/释放意味着将每个对象添加到自动释放池中,并在对象上触发释放消息,直到自动释放池中的所有对象都被释放