ios - 保留和分配有什么区别

标签 ios objective-c memory-management automatic-ref-counting reference-counting

这个问题在这里已经有了答案:





@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 增加和减少保留计数。 , releaseautorelease在正确的地方。 Xcode 的“静态分析器”(Xcode 的“产品”菜单上的“分析器”选项或通过按 shift+command+B)在查看我们的代码并确定我们是否正确执行此操作方面做得非常出色。如果你正在编写手动引用计数代码,这个工具是必不可少的。

    但是,“automatic reference counting”的美妙之处在于我们离开了这个增加和减少对象 retainCount 的愚蠢世界。我们身后的值(value)观。我们转移到一个可以专注于“object graph”的世界,我们在代码中的某些地方需要什么样的引用,编译器负责增加和减少 retainCount。为了我们。

    关于ios - 保留和分配有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38954864/

    相关文章:

    ios - 在 iOS 中,即使设备处于同一个位置,也会检测到不同的位置

    ios - 显示/隐藏按钮时应用崩溃

    ios - nsarray 中缺少数字

    ios - 我想像 Instagram 一样播放视频(如果没有视频则显示图像)?

    ios - 如何使用 UICollectionView 创建 3 列

    numpy - 如何将 CUDA 固定 "zero-copy"内存用于内存映射文件?

    ios - 我如何在 ios 的 swreveal View Controller 中推送弹出?

    IOS OpenAL 和静音开关

    c - 处理动态矩阵中的指针的问题

    objective-c - 我应该寻找什么可能会增加我在不解除分配的 UIViewController 中的保留计数