这个问题在这里已经有了答案:
@property retain, assign, copy, nonatomic in Objective-C
(5 个回答)
5年前关闭。
我搜索了很多链接并阅读了很多文章,但我找不到 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);
输出 :
Array one : (
1,
2,
3,
66
)
Array two : (
1,
2,
3,
66
)
Array three : (
1,
2,
3,
66
)
上面的例子给了我同样的输出。
考虑到上面的例子,我如何定义
assign
之间的区别?和 retain
?如果上面的例子是错误的,请用更好的例子给出答案。
最佳答案
您正在查看指向同一个对象的三个不同变量,因此当然当您显示输出时,每次都会看到同一个对象。retain
对比 assign
是内存限定符的类型,但不影响底层对象是什么。具体来说,它们仅影响 retainCount
的基础对象。
让我们看看你的三行代码:
NSMutableArray *arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
这将创建一个保留计数为 +1 的对象。
NSMutableArray *arr2 = [arr1 retain];
这将该对象的保留计数增加到 +2,并且您有另一个指向同一对象的变量。
NSMutableArray *arr3 = arr1; //Assign
这不会进一步增加保留计数,并且您现在有第三个变量指向同一个对象。
“引用计数”内存管理的基本游戏是确保:
retainCount
减少到零,因此当自动释放池耗尽时,对象将被释放......未能在正确的位置减少计数器可能导致对象泄漏。 可以想象,这会导致一个相当脆弱的过程,我们必须确保使用
retain
增加和减少保留计数。 , release
和 autorelease
在正确的地方。 Xcode 的“静态分析器”(Xcode 的“产品”菜单上的“分析器”选项或通过按 shift+command+B)在查看我们的代码并确定我们是否正确执行此操作方面做得非常出色。如果你正在编写手动引用计数代码,这个工具是必不可少的。但是,“automatic reference counting”的美妙之处在于我们离开了这个增加和减少对象
retainCount
的愚蠢世界。我们身后的值(value)观。我们转移到一个可以专注于“object graph”的世界,我们在代码中的某些地方需要什么样的引用,编译器负责增加和减少 retainCount
。为了我们。
关于ios - 保留和分配有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38954864/