0

AAA.米:

- (void)keepCurrentArray:(id)object
{
     _currentTest=[[NSMutableArray alloc]init];
    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}

BBB.m 类将对象传递给 AAA 类。现在,如果我将 X 传递给上述方法,那么数组将是:one,two,X。然后我将它发送 Y 并且数组将one,two,Y代替我想要完成的:one,two,x,one,two,y。那是因为我每次都在分配和初始化 _currentTest 吗?我该如何解决?

更新: 我有一些关于如何解决这个问题的建议,但没有一个对我有用。我用答案中的代码创建了一个新项目,当我尝试添加我得到的第二个对象时,我仍然得到相同的结果:one, two, test而不是one,two,test,one,two,test

4

4 回答 4

2

是的,这是因为您每次运行该方法时都在分配和初始化。相反,放入_currentTest = [[NSMutableArray alloc] init];AAA.m 的 init 方法。

AAA.m

-(id)init
{
    if ((self = [super init]))
        _currentTest = [[NSMutableArray alloc] init];
    return self;
}

- (void)keepCurrentArray:(id)object
{
    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}
于 2012-12-08T02:49:53.693 回答
1

_currentTest好吧,如果您希望能够在方法调用之间保留它, 那么您需要有一个属性。

把它放在你的 .h 文件中
@property (nonatomic, copy) NSMutableArray * currentTest;

这在小时 .m 文件中

- (NSMutableArray *)currentTest
{
    if (!_currentTest)
        _currentTest = [[NSMutableArray alloc] initWithCapacity:11];

    return _currentTest;
}

- (void)keepCurrentArray:(id)object
{
    [self.currentTest addObject:@"one"];
    [self.currentTest addObject:@"two"];
    [self.currentTest addObject:object];
    NSLog(@"My Array is:%@", self.currentTest);
}

我只是试试你放在 drop box 上的代码,它的工作方式完全符合预期,数组保持它的价值和一切,
但是

正如它所假设的那样,这不是您想要实现的目标

你的问题不在 AAA.m,你的问题在 BBB.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewController *kios = [ViewController new];
    [kios keepCurrentArray:@"Test"];
    [kios keepCurrentArray:@"Test2"];

}

我冒昧地将 添加@"test2"到您发送的代码中。如果你运行它,你会看到在第二次调用时你的数组仍然存在。
这里的REAL问题是您NEW每次都在创建一个 ViewController。一个全新的,它是空的(干净的)是正常的,它是一个新的。
如果我星期一买了一个记事本并把它填满,我不希望我在星期五买另一个记事本时已经填满了我在上一个星期一写的东西。
但这正是您对 ViewController 所期望的行为。

您需要将 NSMutableArray 存储在另一个不会被破坏和一遍又一遍地创建的对象中。

于 2012-12-08T03:45:46.517 回答
1

发生这种情况是因为每次调用方法时都会创建一个新数组。基本上,您需要查看它是否已经创建,并且仅在需要时才创建它。您可以将方法更改为:

- (void)keepCurrentArray:(id)object
{
    if (!_currentTest) 
    {
        _currentTest=[[NSMutableArray alloc]init];
    }

    [_currentTest addObject:@"one"];
    [_currentTest addObject:@"two"];
    [_currentTest addObject:object];
    NSLog(@"My Array is:%@",_currentTest);
}

编辑:
除了上述问题外,您还需要更正此代码(已删除评论):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewController *kios = [ViewController new];
    [kios keepCurrentArray:@"Test"];
}

每次单击表中的一行时,此代码都会创建一个新实例。ViewController因为您正在创建一个实例而不是重用旧实例,所以每次都从一个空数组开始。为了继续添加到同一个数组,您需要继续使用同一个视图控制器。

为此,您需要在 .h 文件中添加声明的属性,类似于currentTest声明的属性:

@property (strong,nonatomic) ViewController *kios;

然后,更改您的操作,以便仅在需要时(第一次)创建一个新的视图控制器,然后在此之后重用它:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!_kios)
    {
        _kios = [ViewController new];
    }

    [_kios keepCurrentArray:@"Test"];
}
于 2012-12-08T03:20:11.497 回答
1

_currentTest=[[NSMutableArray alloc]init];在一个方法上从来都不是一件好事!!!

根据命名约定,它似乎是 AAA 类的属性。所以对于属性,alloc+init 应该是 ininitawakeFromNib。所以如果只初始化一次。

但是,在某些情况下,init 被多次调用,然后您以前的值会丢失并添加新的集合。

所以你可以做的是创建另一个类并将这个_currentTestArray 放在那里并使其成为静态并在这里使用它。我希望这会正常工作。并确保在该类的 init 方法中只初始化一次,如下所示:

//**this is not compiled and checked may contains typo and errors**

@implementation Storage

static NSMutableArray *yourStaticArray;

-(id)init{
    self = [super init];
    if (self) {
        if (!yourStaticArray) {
            yourStaticArray=[NSMutableArray new];
        }
    }
    return self;
}

-(void)addYourStaticArray:(NSString *)val{
    [yourStaticArray addObject:val];
}


-(NSArray *)yourStaticArray {
    return yourStaticArray ;
}

@end
于 2012-12-08T13:15:03.997 回答