[英]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方法? 假设您定义了一个属性numbers
, setNumbers
将为您合成一个名为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.