为什么发布返回(oneway void)但autorelease返回(id)?

Sam*_*Sam 1 objective-c

如果我这样做 -

SomeObject* someObject = [[SomeObject alloc] init];
[[someObject release] release];
Run Code Online (Sandbox Code Playgroud)

我认为我的程序不会崩溃,因为第二次过度释放没有任何作用.

[[someObject autorelease] autorelease];
Run Code Online (Sandbox Code Playgroud)

会崩溃,因为对象是通过链传递两次释放的.

这只是一个好奇的问题,我想我到目前为止从未遇到任何问题.

Dar*_*ust 7

(请参阅此答案以获得解释oneway.)

你的第一个例子甚至没有编译,因为void!= nil.但是如果你只是release在一个保留计数为1的对象上调用两次,它肯定会崩溃.

至于为什么release返回voidautorelease返回id:第一个说我不再需要这个对象,你可以摆脱它.因此,如果它会返回一些东西并且你会对它进行操作,那么你很可能会操作一个死对象.相比之下,autorelease或多或少地说:"很快我就不再需要这个物体,而是让它一直存在,直到我完成当前的方法."

所以当你看到它们相似时,他们说我不再需要这个物体,但它们在时间上有所不同:release"你现在可以摆脱物体",同时autorelease"你可以摆脱它对象后来 ".