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];
}