将NSArray对象指定给其他NSArray对象是否正确



只是为了提高项目中的代码质量而感到困惑。将NSArray对象分配给另一个NSArraySArray对象。

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

#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;

您的问题涉及一个核心主题,这在用任何语言编程时都是至关重要的,即引用类型语义之间的差异。

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

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

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

这上面写了很多,这里有一些来自大学的幻灯片,非常清楚地解释了这一切。

HTH

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

最新更新