繁体   English   中英

将NSArray复制到成员变量

[英]Copy NSArray to member variable

我上课时有个二传手:

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

}

如果我像这样调用设置器:

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编写setNumbers setter方法? 假设您定义了一个属性numberssetNumbers将为您合成一个名为setNumbers的设置方法。 更糟糕的是,您的setNumbers自称! 构造

self.numbers = tArray;

相当于打电话

[self setNumbers:tArray];

这导致无限递归。

setNumbers ,我建议不要编写自己的setNumbers setter方法,除非有充分的理由这样做。 默认的setter会做各种奇妙的事情(适当的内存管理,KVO等),因此您应该认真思考一下,以自己的方式替换它。 如果可以的话,只要让编译器为您综合访问器方法(setter和getter)即可。

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

self.numbers如何定义? 您可能不需要在这里自行设置。

而不是

@property (nonatomic, retain) NSArray *numbers;

您可以声明已复制:

@property (nonatomic, copy) NSArray *numbers;

然后让动态设置器为您完成复制工作。 这还将处理传入的nil。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM