复制NSArray到成员变量



在我的类中有一个setter:

-(void)setNumbers:(NSArray *)aNumbers{
  NSArray *tArray = [[NSArray alloc]initWithArray:aNumbers]; //throws BAD ACCESS
  self.numbers = tArray;
  //also tried self.numbers = [tArray copy];
  [tArray release];
}

如果我这样调用setter:

NSArray *numbers = [TicketManager getRandomNumbersFor:@"LottoNormal"];
[self.ticket setNumbers:numbers];

在'getRandomNumbersFor:'方法中(循环被执行):

+(NSArray *)getRandomNumbersFor:(NSString *)aTicketType{
  NSLog(@"getting RandomNumbers for: %@",aTicketType);
  NSMutableArray *tResult;
  if([aTicketType isEqualToString:@"LottoNormal"]){
    tResult = [NSMutableArray arrayWithCapacity:6];
    for(int i = 0;i<6;i++){
        int tNumber = arc4random() % 48;
        tNumber++;
        NSLog(@"Number: %i",tNumber);
        [tResult addObject:[NSNumber numberWithInt:tNumber]];
    }
  }
  return tResult;
}

ViewController中,我在标记行中获得了不良访问。
有人能帮忙吗?

顺便问一下,为什么要编写setNumbers setter方法?假设您定义了一个属性numbers,那么将为您合成一个名为setNumbers的setter方法。更糟糕的是,你的setNumbers调用自己!结构

self.numbers = tArray;

等价于调用

[self setNumbers:tArray];

导致无限递归。

作为题外话,我建议不要编写自己的setNumbers setter方法,除非有令人信服的理由这样做。默认设置器做了各种奇妙的事情(适当的内存管理、KVO等),所以您应该仔细考虑用自己的设置器替换它。如果可以的话,让编译器为您合成访问器方法(setter和getter)。

如果出于某种原因必须编写自己的访问器方法,至少要确保引用实例变量,而不是访问器方法。

如何自我。数定义的?你可能不需要在这里创建自己的setter。

而不是

@property (nonatomic, retain) NSArray *numbers;

可以声明为复制:

@property (nonatomic, copy) NSArray *numbers;

让动态设置器为你做拷贝工作。这也将处理传入的nil

最新更新