【问题标题】:Is it right to assign the NSArray object to other NSArray object?将 NSArray 对象分配给其他 NSArray 对象是否正确?
【发布时间】:2016-04-06 17:00:28
【问题描述】:

只是对提高项目中的代码质量感到困惑。将 NSArray 对象分配给另一个 NSArray 对象是否正确。但我没有分配一个 NSArray 对象。

它就在代码下面吗?内存管理问题有什么问题吗?

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, weak) NSArray *array1;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *array2 = [[NSArray alloc] initWithObjects:@"A",@"B",@"C", nil];

    NSLog(@"array2 count : %lu",(unsigned long)array2.count);

    self.array1 = array2;

    NSLog(@"array1 count : %lu",(unsigned long)self.array1.count);


    // Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

Output :- 
2016-04-06 22:22:56.057 PhotoViewer[969:56203] array2 count : 3
2016-04-06 22:22:56.057 PhotoViewer[969:56203] array1 count : 3

我的问题,array1对象是否需要alloc?

Ex : self.array1 = [[NSArray alloc] init];
     self.array1 = array2;

【问题讨论】:

  • 如果您接下来要做的是通过为指针分配不同的对象来替换它,则无需分配一个数组来分配给 array1 指针。
  • 上面的代码会为你提供两个变量,它们都指向同一个对象。如果你真的想要一个对象的单独副本,你必须专门执行一个副本。

标签: ios objective-c memory-management nsarray


【解决方案1】:

您的问题解决了一个核心主题,在使用任何语言进行编程时都必须理解该主题 - valuereference typestypes 和 语义。

总而言之:对于两个值类型变量之间的赋值,用于表示值的实际位被复制,并且在赋值之后,两个变量之间没有任何联系——改变一个变量不会影响另一个变量。由于这些位直接存储在变量中,因此无需为它们分配单独的存储空间。在 Objective-C 中,double 等类型是值类型。

对于引用类型,用于表示值的位存储在与变量不同的存储中,并且该不同存储的 地址 是存储在变量中的内容。赋值复制此地址,因此在赋值后两个变量引用相同的值。对于可变值,通过一个变量更改值也会影响另一个变量所看到的内容。引用类型的存储需要与变量分开管理,当需要新的不同值时,需要分配新的存储,并将值位复制到其中。每个不同的值通常称为一个对象。例如,在 Objective-C 中,NSString 是不可变引用类型,而 NSMutableArray 是可变引用类型。在任何一种情况下,都会使用alloc/initnew 等创建新的不同对象。简单的分配会导致共享。

在您的示例中,分配是共享一个不可变数组,不需要alloc 一个副本。

这方面写的很多,这里有一些来自大学的slides,解释得很清楚。

HTH

【讨论】:

    【解决方案2】:

    不,不需要。 array1 只是一个指向array2 已经指向的内存的指针,你不需要为array1 分配任何内存,因为这两个指针指向同一个内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多