【问题标题】:Adding values to two different NSMutableArray without increasing the retain count在不增加保留计数的情况下将值添加到两个不同的 NSMutableArray
【发布时间】: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


【解决方案1】:

这在理想情况下会起作用,似乎是设置对象的一些问题。 例如你可以这样检查 -

NSMutableString *firstString = [[NSMutableString alloc] initWithString:@"first"];
NSMutableString *secondString = [[NSMutableString alloc] initWithString:@"second"];

NSMutableArray *originalArray = [[NSMutableArray alloc] initWithObjects: firstString, secondString, nil];
NSMutableArray *copyArray = [[NSMutableArray alloc] initWithObjects: firstString, secondString, nil];

[[copyArray objectAtIndex:0] appendString:@"add some text"];

for (int index = 0; index < [originalArray count]; index++) {
    NSLog(@"Original:%@ --- copy:%@", [originalArray objectAtIndex:index], [copyArray objectAtIndex:index]);
}

输出是 -

2012-05-09 10:28:40.382 Demo[5237:f803] Original:firstadd some text --- copy:firstadd some text
2012-05-09 10:28:40.384 Demo[5237:f803] Original:second --- copy:second

EDIT - (初始化时不添加对象)

NSMutableString *firstString = [[NSMutableString alloc] initWithString:@"first"];
NSMutableString *secondString = [[NSMutableString alloc] initWithString:@"second"];

NSMutableArray *originalArray = [[NSMutableArray alloc] init];
NSMutableArray *copyArray = [[NSMutableArray alloc] init];

[originalArray addObject:firstString];
[copyArray addObject:firstString];

[originalArray addObject:secondString];
[copyArray addObject:secondString];

[[copyArray objectAtIndex:0] appendString:@"add some text"];

for (int index = 0; index < [originalArray count]; index++) {
    NSLog(@"Original:%@ --- copy:%@", [originalArray objectAtIndex:index], [copyArray objectAtIndex:index]);
}

输出 -

2012-05-09 11:11:18.275 Demo[5433:f803] Original:firstadd some text --- copy:firstadd some text
2012-05-09 11:11:18.277 Demo[5433:f803] Original:second --- copy:second

【讨论】:

  • 很抱歉,我无法在数组初始化时设置对象。对象是在运行时根据用户操作创建的。所以我只需要在运行时添加对象。
  • 为什么不尝试在初始化后在 originalArray 和 copyArray 上添加对象。然后尝试修改其中一个数组中的对象并打印结果。结果不会一样。 :(
  • @codesnooker - 结果还是一样,setValue 是你的自定义方法吗?
  • 我检查了你的代码,它运行良好。看起来我在原始代码的某个地方搞砸了。无法找出原文中的问题。但感谢您的解决方案。我会挖掘我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2022-12-22
  • 2012-10-29
相关资源
最近更新 更多