Ios 将NSArray复制到成员变量

Ios 将NSArray复制到成员变量,ios,objective-c,nsmutablearray,nsarray,Ios,Objective C,Nsmutablearray,Nsarray,我班上有一个二传手: -(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 *

我班上有一个二传手:

-(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];
在“GetRandomNumberFor:”方法中(执行循环):

+(NSArray*)getRandomNumbersFor:(NSString*)aTicketType{
NSLog(@“获取的随机数为:%@”,类型);
NSMutableArray*tResult;
if([aTicketType IsequalString:@“LottoNormal”]){
tResult=[NSMutableArray阵列容量:6];

对于(inti=0;iself.numbers是如何定义的?您可能不需要在这里创建自己的setter

而不是

@property (nonatomic, retain) NSArray *numbers;
您可以将其声明为已复制:

@property (nonatomic, copy) NSArray *numbers;

并让动态setter为您执行复制工作。这还将处理传入的nil。

self.number是如何定义的?您可能不需要在此处创建自己的setter

而不是

@property (nonatomic, retain) NSArray *numbers;
您可以将其声明为已复制:

@property (nonatomic, copy) NSArray *numbers;

让动态setter为您执行复制工作。这也将处理传入的nil。

顺便问一下,为什么要编写
setNumbers
setter方法?如果您定义了一个属性,
numbers
,那么将为您合成一个名为
setNumbers
的setter方法。更糟糕的是,您的
setNumbers
调用本身!构造

self.numbers = tArray;
相当于打电话

[self setNumbers:tArray];
这将导致无限递归

另一方面,我建议不要编写自己的
setNumbers
setter方法,除非有令人信服的理由这样做。默认setter可以做各种各样的事情(适当的内存管理、KVO等),因此,您应该仔细考虑用自己的方法替换它。如果可以的话,让编译器为您合成访问器方法(setter和getter)


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

顺便问一下,为什么要编写
setNumbers
setter方法?如果定义了一个属性,
numbers
,那么名为
setNumbers
的setter方法将是synt更糟糕的是,你的
setNumbers
调用自己!构造

self.numbers = tArray;
相当于打电话

[self setNumbers:tArray];
这将导致无限递归

另一方面,我建议不要编写自己的
setNumbers
setter方法,除非有令人信服的理由这样做。默认setter可以做各种各样的事情(适当的内存管理、KVO等),因此,您应该仔细考虑用自己的方法替换它。如果可以的话,让编译器为您合成访问器方法(setter和getter)


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

您需要告诉我们aNumbers是什么。在我看来,aNumbers在这里可能为零。感谢您的提示,我更新了我的问题,很遗憾,它现在有点臃肿。因此,是的……可以返回tResult如果您没有“乐透正常”的票证类型,则为零。在您的setter中,检查传入的nil。顺便问一下,为什么要编写
setNumbers
setter方法?如果您定义了一个属性,
numbers
,将为您合成一个名为
setNumbers
的setter方法。更糟糕的是,您的
setNumbers
会调用自身!构造
self.numbers=tArraye> 最后调用
[自我设置号码:tArray]
。对我来说,这看起来像是无限递归。不要编写自己的
集合号
。让编译器为你做这件事。非常感谢你,我现在明白了。你需要告诉我们一个数是什么。在我看来,这里的一个数可能是零。谢谢你的提示,我更新了我的问题,很遗憾,它现在有点臃肿。所以是的……tResult可以返回d零,如果您没有“乐透正常”的票证类型。在您的setter中,检查传入的nil。顺便问一下,为什么要编写
setNumbers
setter方法?如果您定义了一个属性,
numbers
,将为您合成一个名为
setNumbers
的setter方法。更糟糕的是,您的
setNumbers
会调用自身!构造
self.numbers=tArraye> 最后调用
[自我设置号码:tArray]
。看起来像是无限递归。不要编写你自己的
集合号
。让编译器为你做这件事。非常感谢,我现在明白了。当然,如果我为类成员创建属性,我不需要设置器!谢谢!当然,如果我为类成员创建属性,我不需要设置器!谢谢!