Iphone 目标-C初始化NSArray与NSMutableArray

Iphone 目标-C初始化NSArray与NSMutableArray,iphone,objective-c,ios,nsmutablearray,nsarray,Iphone,Objective C,Ios,Nsmutablearray,Nsarray,为什么这样做有效: self.array = newArray; 但这并不是: [[self mutableArray] addObject:object]; 也就是说,当我不必初始化NSArray时,为什么我需要初始化NSMutableArray才能让它工作呢 编辑:这是更清晰的家伙 接口: @interface Foo : UIViewController { } @property (nonatomic, retain) NSArray *array; @property (non

为什么这样做有效:

self.array = newArray;
但这并不是:

[[self mutableArray] addObject:object];
也就是说,当我不必初始化NSArray时,为什么我需要初始化NSMutableArray才能让它工作呢

编辑:这是更清晰的家伙

接口:

@interface Foo : UIViewController {

}

@property (nonatomic, retain) NSArray *array;
@property (nonatomic, retain) NSMutableArray *mutableArray;

@end
实施:

@implementation Foo

@synthesize array;
@synthesize mutableArray;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.array = [Class returningAnArray];
    [[self mutableArray] addObject:objectIHaveOmittedTheCode];
}

@end
在此行中,您将已创建的对象指定给self.array。因此,您无需创建它

[[self mutableArray] addObject:object];
但在这一行中,您试图将一个对象添加到实际未创建的数组中。如果不创建数组,它将是nil,向nil发送消息不会产生任何效果。

在Objective-C中,对象是不可变的

self.array = newArray;
此行是一个属性赋值。self.array属性返回指向内存中包含对象的位置的引用。通过将属性指定给不同的对象,您并不是在真正修改对象本身

如果要修改现有对象,必须创建包含相同元素的对象:

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:self.array];
[mutableArray addObject:object];
请注意,继承自,因此您可以安全地将mutableArray引用的对象分配给任何类型的变量。

[Class returningArray]为您进行了分配。每个对象都需要分配,并且应该在使用之前进行初始化。解决办法是

- (void)viewDidLoad {
    [super viewDidLoad];
    self.array = [Class returningAnArray];
    self.mutableArray = [NSMutableArray array];
    //Now you can use mutable array
    [[self mutableArray] addObject:objectIHaveOmittedTheCode];
}

现在,您已经创建了数组和可变数组,但没有显式地调用alloc,因为这些类已经为您完成了创建。

您提供的代码本身不起作用,这个问题没有任何意义,请澄清,否则这篇文章将被关闭。没有足够的信息来决定这两种情况。newArray是如何创建的?什么是self,它有可变数组方法吗?如果是,它会返回什么?如果是属性,是否已初始化?最后,您真正想要完成什么?我看到了您的编辑,但实现与接口不匹配。请再编辑一次。为了清楚起见,它实际上是一个属性的赋值。self中可能有也可能没有名为array的变量。
- (void)viewDidLoad {
    [super viewDidLoad];
    self.array = [Class returningAnArray];
    self.mutableArray = [NSMutableArray array];
    //Now you can use mutable array
    [[self mutableArray] addObject:objectIHaveOmittedTheCode];
}