在一本书中,说如下:
那么你怎么知道对象何时拥有,以及由谁拥有?请考虑以下示例:
Run Code Online (Sandbox Code Playgroud)NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;在此示例中,您使用
alloc关键字forstr,因此您拥有str.因此,您需要在不再需要时释放它.但是,str2只是指向str,所以你不拥有str2,这意味着str2当你完成使用它时你不需要释放.
我认为所有权是按对象而不是变量或指针...所以我们不能说我们"拥有str"或"拥有str2"......我们拥有一个对象,它由任何一个str或者指向str2,如果我们使用[str release]或者[str2 release],它完全一样.
另一种描述是:
例如,考虑上一节中使用的示例:
Run Code Online (Sandbox Code Playgroud)NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---尝试发布
str2将导致运行时错误,因为您无法释放不属于您的对象.
[str2 release]如果以前调用过,我们实际上可以使用 [str release].如果我们这样做,那么该行[str release]会导致错误,因为现在str还有str2都是悬摆指针,并且据说当release在第一时间被送到对象时,引用计数变成了0,并dealloc立即调用,并且内存被释放由C函数free().
以上是否正确,或者还有其他问题需要纠正?
不要在管理内存方面考虑它,而是在对象所有权方面.在分配,保留或复制对象时,您将获得对象的所有权.您有责任准确发布您拥有的对象,而不是其他对象.
在你的例子中,赋值str2不取得对象的所有权,但是如果你真的需要第二个"拥有"引用它,那么你应该这样做[str2 retain],之后这不是一个错误[str release]; [str2 release];.这也是使用ARC自动发生的情况,除非您注释str2为弱引用.(当然,在这个简单的情况下,编译器可以在内部优化不必要的保留/释放.)
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |