Ios 保留alloc和init上的计数

Ios 保留alloc和init上的计数,ios,objective-c,cocoa-touch,automatic-ref-counting,Ios,Objective C,Cocoa Touch,Automatic Ref Counting,一些网站表示: @property (nonatomic, strong) MyObject *foo; self.foo = [[MyObject alloc] init]; 将保留计数增加到2 但是由于最新的xcode版本或ARC,这应该不会是一个问题,对吗 根据视频,我们可以取消所有自动释放 因此: @property (nonatomic, strong) MyObject *foo; self.foo = [[[MyObject alloc] init] autorelease]

一些网站表示:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];
将保留计数增加到2

但是由于最新的xcode版本或ARC,这应该不会是一个问题,对吗

根据视频,我们可以取消所有自动释放

因此:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[[MyObject alloc] init] autorelease];
变成这样

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

那么,我是否应该忽略这样一个网站:self.foo=[[MyObject alloc]init]将保留计数增加到2?

ARC使该语句不真实。自动释放没有消失,它只是由编译器插入,现在你看不到它。

ARC使该语句不真实。自动释放没有消失,它现在只是由编译器插入,您无法看到它。

如果没有ARC,您可能应该使用
retain
(以及相应的
assign
)而不是
strong
(和
)。在第一个示例中,如果没有ARC,
-init
方法返回一个保留计数为1的对象,
foo
属性的setter将保留计数增加到2

在第二个示例中(必须没有ARC,因为ARC不能使用
-autorelease
),调用
-autorelease
将对象添加到自动释放池中,并将其保留计数减少1,因此对象的保留计数最终为1(对于属性)


对于ARC,就像在第三个示例中一样,您根本不需要担心ARC点的保留计数。在引擎盖下,
-init
仍应返回保留计数为1的对象,
foo
的setter仍应增加保留计数,但编译器应在调用setter后的某处插入一个
-release
。基本上,使用ARC,因为属性是
strong
,一旦将对象分配给属性,您就可以依赖该对象继续存在,并且您不必考虑
retain
/
release
/
自动释放
如果没有ARC,您可能应该使用
retain
(并相应地
assign
)而不是
strong
(和
weak
)。在第一个示例中,如果没有ARC,
-init
方法返回保留计数为1的对象,
foo
属性的setter将保留计数增加到2

在第二个示例中(必须没有ARC,因为ARC不能使用
-autorelease
),调用
-autorelease
将对象添加到自动释放池中,并将其保留计数减少1,因此对象的保留计数最终为1(对于属性)


对于ARC,就像在第三个示例中一样,您根本不需要担心ARC点的保留计数。在引擎盖下,
-init
仍应返回保留计数为1的对象,
foo
的setter仍应增加保留计数,但编译器应插入一个
-releasestrong
,一旦将对象分配给属性,您就可以依赖该对象继续存在,并且您不必考虑
保留
/
释放
/
自动释放

编译器是否插入了
自动释放
或实际发布的
是否在正确的位置?@Isaac这是一个实现细节。这有什么关系?我们关心的是编译器没有不必要地泄漏内存。@CodaFi:在大多数情况下,是的,但值得知道是否正在使用自动释放池,因为在某些情况下,出于性能考虑在ns中,可以专门使用备用自动释放池和/或在特定点耗尽池。此外,当对象离开时,它可能会更改。@Isaac存储限定符的作用是避免担心大部分问题。内存管理及其性能现在是编译器的工作,我们没有什么发言权关于它是如何工作的(没有回到MRC)。@CodaFi:一般来说,我同意;但是,为了调试的目的,知道编译器是否在它认为是最后一次使用变量之后立即插入
版本
(与
自动释放
相反),如果变量指向的对象应该在代码块的其余部分继续存在,但神秘地被释放。编译器是在正确的位置插入
自动释放
还是实际的
释放
?@Isaac这是一个实现细节。这有什么关系?我们关心的只是编译器没有不必要地泄漏内存。@CodaFi:在大多数情况下,是的,但值得知道是否正在使用自动释放池,因为在某些情况下,出于性能原因,可能会特别使用备用自动释放池和/或在特定点耗尽池。此外,当对象离开时,它也会发生变化。@Isaac存储限定符是为了避免大部分担心。内存管理及其性能现在是编译器的工作,我们对它的工作方式几乎没有发言权(除了返回MRC)@CodaFi:一般来说,我同意;但是,为了调试的目的,知道编译器是否在它认为是最后一次使用变量之后立即插入
版本
(与
自动释放
相反),如果变量指向的对象应该在代码块的其余部分继续存在,但神秘地被释放。那么您是说使用arc,@property(非原子,强)MyObject*foo;self.foo=[[MyObject alloc]init];将增加保留计数2,但最终将使保留计数为0?首先,重要的一点是:如果使用ARC,则根本不应考虑保留计数;强属性将确保它指向的任何对象都继续存在。