0

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):

+(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.
Can anyone can help?

4

2 回答 2

2

顺便问一下,为什么要写setNumberssetter方法呢?鉴于您定义了一个属性 ,将为您合成numbers一个调用的 setter 方法。setNumbers更糟糕的是,你的setNumbers电话本身!构造

self.numbers = tArray;

相当于调用

[self setNumbers:tArray];

这导致无限递归。

setNumbers顺便说一句,除非有令人信服的理由,否则我建议不要编写自己的setter 方法。默认的 setter 做了很多很棒的事情(适当的内存管理、KVO 等),所以你应该仔细考虑用你自己的来替换它。如果可以的话,让编译器为你合成你的访问器方法(setter 和 getter)。

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

于 2013-04-25T13:22:48.520 回答
1

self.numbers 是如何定义的?您可能不需要在这里制作自己的二传手。

而不是

@property (nonatomic, retain) NSArray *numbers;

你可以声明是复制的:

@property (nonatomic, copy) NSArray *numbers;

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

于 2013-04-25T13:17:14.070 回答