在我的类中有一个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