简体   繁体   English

将NSArray复制到成员变量

[英]Copy NSArray to member variable

I have a setter in my class: 我上课时有个二传手:

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

}

If I invoke the setter like this: 如果我像这样调用设置器:

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

In the 'getRandomNumbersFor:' method (the loop gets executed): 在“ 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;
}

In a ViewController I´m getting a bad access in the marked line. ViewController我在标出的行中获得了错误的访问权限。
Can anyone can help? 谁能帮忙?

By the way, why have you written the setNumbers setter method? 顺便说一句,为什么setNumbers编写setNumbers setter方法? Given that you defined a property, numbers , a setter method called setNumbers will be synthesized for you. 假设您定义了一个属性numberssetNumbers将为您合成一个名为setNumbers的设置方法。 Worse, your setNumbers calls itself! 更糟糕的是,您的setNumbers自称! The construct 构造

self.numbers = tArray;

is equivalent to calling 相当于打电话

[self setNumbers:tArray];

That results in infinite recursion. 这导致无限递归。

As an aside, I'd advise against writing your own setNumbers setter method unless there is a compelling reason to do so. setNumbers ,我建议不要编写自己的setNumbers setter方法,除非有充分的理由这样做。 The default setter does all sorts of wonderful stuff (appropriate memory management, KVO, etc.), so you should think long and hard about replacing it with your own. 默认的setter会做各种奇妙的事情(适当的内存管理,KVO等),因此您应该认真思考一下,以自己的方式替换它。 Just let the compiler synthesize your accessor methods (setters and getters) for you, if you can. 如果可以的话,只要让编译器为您综合访问器方法(setter和getter)即可。

If you have to write your own accessor methods for some reason, at the very least, make sure to reference instance variables, not accessor methods. 如果由于某种原因必须编写自己的访问器方法,至少要确保引用实例变量,而不是访问器方法。

How is self.numbers defined? self.numbers如何定义? You may not need to make your own setter here. 您可能不需要在这里自行设置。

Rather than 而不是

@property (nonatomic, retain) NSArray *numbers;

you could declare is as copied: 您可以声明已复制:

@property (nonatomic, copy) NSArray *numbers;

And let the dynamic setter do the copy work for you. 然后让动态设置器为您完成复制工作。 This'll also handle an incoming nil. 这还将处理传入的nil。

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

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