Rav*_*hak 1 memory-management reference-counting objective-c ios automatic-ref-counting
我搜索了许多链接并阅读了很多文章,但我找不到确切的区别retain和assign..
我正在尝试以下方法:
NSMutableArray *arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSMutableArray *arr2=[arr1 retain];
NSMutableArray *arr3 = arr1; //Assign
[arr1 addObject:@"66"];
NSLog(@"Array one : %@",arr1);
NSLog(@"Array two : %@",arr2);
NSLog(@"Array three : %@",arr3);
Run Code Online (Sandbox Code Playgroud)
输出:
Array one : (
1,
2,
3,
66
)
Array two : (
1,
2,
3,
66
)
Array three : (
1,
2,
3,
66
)
Run Code Online (Sandbox Code Playgroud)
以上示例给出了相同的输出.
考虑到上面的例子,我如何定义assign和之间的区别retain?
如果以上示例有错,请提供更好的示例提供答案.
您正在查看指向同一对象的三个不同变量,因此当您显示输出时,您每次都会看到相同的对象.
该retainVS assign是类型的存储预选赛,但不影响底层的对象是什么.具体而言,它们仅影响retainCount底层对象.
我们来看看你的三行代码:
NSMutableArray *arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
Run Code Online (Sandbox Code Playgroud)
这会创建一个保留计数为+1的对象.
NSMutableArray *arr2 = [arr1 retain];
Run Code Online (Sandbox Code Playgroud)
这会将该对象的保留计数增加到+2,并且您有另一个指向同一对象的变量.
NSMutableArray *arr3 = arr1; //Assign
Run Code Online (Sandbox Code Playgroud)
这不会进一步增加保留计数,现在您有第三个指向同一对象的变量.
"引用计数"内存管理的基本游戏是确保:
正在使用的对象具有正保留计数(因此在您仍在使用它时不会释放它)...如果未能正确执行此操作可能会导致对象过早释放,可能会使您丢失引用; 和
一个你没有进一步使用的对象retainCount减少到零,这样当自动释放池耗尽时,对象将被释放...未能在正确位置递减计数器可能导致对象泄露.
你可以想像,这将导致一个相当脆弱的进程,我们必须确保我们增加与递减我们保留计数retain,release并autorelease在适当的地方.Xcode的"静态分析器"(Xcode的"产品"菜单上的"分析器"选项或按shift+ command+ B)可以很好地查看我们的代码并确定我们是否已正确完成此操作.如果您正在编写手动引用计数代码,则此工具是必不可少的.
但是," 自动引用计数 " 的美妙之处在于,我们离开了这个愚蠢的世界,即增加和减少retainCount我们背后的对象价值.我们转向一个我们可以专注于" 对象图 " 的世界,我们在代码中的某些位置需要哪些引用,编译器负责retainCount为我们递增和递减.
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |