将NSArray对象分配给其他NSArray对象是否正确?

时间:2016-04-06 17:00:28

标签: ios objective-c memory-management nsarray

只是混淆了提高项目的代码质量。将 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对象分配?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的问题涉及一个核心主题,这对于理解何时使用任何语言进行编程至关重要 - 参考 类型和<之间的区别EM>语义

总结:对于两个值类型变量之间的赋值,用于表示该值的实际位被复制,并且在赋值之后,两个变量之间没有连接 - 改变一个不影响另一个。由于位直接存储在变量中,因此无需为它们分配单独的存储空间。在Objective-C类型中,例如double是值类型。

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

在您的示例中,赋值是共享不可变数组,不需要alloc副本。

有很多关于此的文章,这里有一些来自大学的slides,它们可以很清楚地解释这一点。

HTH