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