【发布时间】:2012-05-09 04:11:37
【问题描述】:
我有两个由几个对象组成的简单 NSMutableArray。其中一些对象可能是常见的,但需要存储在两个数组中,因为两个数组的用途是为完全不同的目的而定义的。
但是,问题在于,在将相同的对象添加到两个数组后,在更改其中一个公共对象的值时,不会反映在第二个数组中。
例如,
假设我们有两个可变的 NSArray:
NSMutableArray *mutableArrayOne;
NSMutableArray *mutableArrayTwo;
现在让我们创建这些数组需要包含的对象定义。
@interface: DummyObject : NSObject
{
int objectValue;
}
@property (nonatomic) int objectValue;
-(void) printObjectValue;
@end
现在让我们创建用于存储数组的基类。
基类定义
@interface: BaseClass : NSObject
{
NSMutableArray *mutableArrayOne;
NSMutableArray *mutableArrayTwo;
}
-(void) init;
-(void) printBothArrays;
@end
基类实现
@implementation BaseClass
-(void) init
{
// initialize the mutable array.
mutableArrayOne = [[NSMutableArray alloc] initWithCapicity:5];
mutableArrayTwo = [[NSMutableArray alloc] initWithCapicity:5];
DummyObject *dummyObject = [DummyObject alloc];
[dummyObject setObjectValue:5];
DummyObject *dummyObjectTwo = [DummyObject alloc];
[dummyObjectTwo setObjectValue:2];
[mutableArrayOne addObject:dummyObject];
[mutableArrayOne addObject:dummyObjectTwo];
[mutableArrayTwo addObject:dummyObjectTwo];
}
@end
现在让我修改数组 One 中的 DummyObject:
for (DummyObject* dummyObject in mutableArrayOne)
{
[dummyObject setValue:100];
}
问题 现在,当我打印两个数组对象的值时,问题就开始了:-
打印第一个数组
for (DummyObject* dummyObject in mutableArrayOne)
{
[dummyObject printObjectValue];
}
*输出日志(来自第一个数组)*
100
100
打印第二个数组
for (DummyObject* dummyObject in mutableArrayTwo)
{
[dummyObject printObjectValue];
}
*输出日志(来自第二个数组)*
2
所以在这里我们可以看到 MutableArray 保留了对象的副本,但是,我只想存储引用。这意味着,在更改第一个数组中对象的值时,应该反映在第二个数组中。
我们怎样才能做到这一点? 我们还有其他选择吗?
谢谢, 帕拉斯门迪拉塔
【问题讨论】:
-
代码示例中有输入地址吗?第一个数组的输出返回 2 100s,第二个数组的输出返回 1 2。这意味着您将 2 个对象添加到第一个数组,将 1 个对象添加到第二个数组,这与您的代码所说的相反。 (这让我相信您的拼写错误使您将它们添加到第一个数组中)
-
谢谢,我已经修复了示例代码。
-
如果你的代码完全一样,你确定不是打印第二个可变数组时没有得到 100?
-
如果初始化虚拟对象会发生什么?
DummyObject *dummyObject = [[DummyObject alloc] init] -
+1 @LuisOscar ,使用此代码,您应该在第二个数组中也将其作为
100。
标签: iphone ios memory memory-management