Objective c awakefromnib中的OBJ C填充数组-范围问题?
我试图填充一个数组,从awakeFromNib调用。我的问题是,当我试图访问变量时,它不可见 以下是相关片段:Objective c awakefromnib中的OBJ C填充数组-范围问题?,objective-c,Objective C,我试图填充一个数组,从awakeFromNib调用。我的问题是,当我试图访问变量时,它不可见 以下是相关片段: -(id)returnHaiku { return [self getOne:[self getOne:five]] // doesn't know what "five" is... } - (void)awakeFromNib { [super awakeFromNib]; [self fillArrays]; } -(id)fillArra
-(id)returnHaiku
{
return [self getOne:[self getOne:five]] // doesn't know what "five" is...
}
- (void)awakeFromNib
{
[super awakeFromNib];
[self fillArrays];
}
-(id)fillArrays
{
NSArray *five=[NSArray arrayWithObjects: @"blustry zen buddhists",@"barking tiny dogs", @"closeted bigot", @"yowling alley cats",@"shrugging teenagers",@"piece of tangled string", @"ball of woolen yarn", @"big pile of garbage", @"line of well-wishers", @"moldy piece of bread", @"middle manager", @"a terrified rat", @"whispering goofballs", @"various people", @"cross-dressing monkey", @"terrifying dolt", @"sneering idiot", @"grinning sycophant", @"hurtful sloganist",@"annoying haiku",@"hardened criminal",@"vile politician", @"lost generation", @"poetical crap",@"slimy strategist", @"fake conservative", @"old-style liberal",@"evil yuppie scum", @"proud midwesterner",@"artful panhandler",@"noisy spoiled brats",@"frustrated poseurs",nil];
return five;
}
-(id)getOne:(NSArray *)myArray
{
return [[myArray objectAtIndex:arc4random()%myArray.count]stringByAppendingString:@"\n"];
}
我很感激你能为这个新手提供的任何帮助。提前感谢。
five
不是实例变量,因此它仅在fillArrays
中可见。您应该将five
设置为实例变量。five
不是实例变量,因此它仅在fillArrays
中可见。您应该将five
作为一个实例变量。您的fillArrays
方法是创建一个新的localNSArray
,然后返回它。但是,您调用此方法的方式如下:
[self fillArrays];
问题是您完全忽略了返回值,这意味着您的数组正在堆栈帧之间的小空隙中丢失。您的
fillArrays
方法是创建一个新的localNSArray
,然后返回它。但是,您调用此方法的方式如下:
[self fillArrays];
问题是您完全忽略了返回值,这意味着您的数组在堆栈帧之间的小空隙中丢失了。确定
回答我自己的问题,但也许这会帮助其他人
以下是相关代码,我最终得出的结论:
-(id)returnHaiku
{
return [self getOne:five];
}
- (void)awakeFromNib
{
[super awakeFromNib];
[self fillArrays];
}
-(void)fillArrays
{
//fill array declared in header file as an instance variable
//Note: it's using arrayWithObjects, a factory method, which I guess
// autoreleases memory after the array is no longer needed...
five=[NSArray arrayWithObjects: @"blustry zen buddhists",@"barking tiny dogs", @"closeted bigot", @"yowling alley cats",@"shrugging teenagers",@"piece of tangled string", nil];
// and here's what I was missing!!
[five retain];
}
-(id)getOne:(NSArray *)myArray
// returns random element from an array
{
return [[myArray objectAtIndex:arc4random()%myArray.count]stringByAppendingString:@"\n"];
}
因此,我之前的问题显然涉及到没有保留我正在填充的数组。我猜它在被传递出该方法后立即被转储,因此不能用于从数组中拾取随机对象的后续方法
这很好。好的
回答我自己的问题,但也许这会帮助其他人
以下是相关代码,我最终得出的结论:
-(id)returnHaiku
{
return [self getOne:five];
}
- (void)awakeFromNib
{
[super awakeFromNib];
[self fillArrays];
}
-(void)fillArrays
{
//fill array declared in header file as an instance variable
//Note: it's using arrayWithObjects, a factory method, which I guess
// autoreleases memory after the array is no longer needed...
five=[NSArray arrayWithObjects: @"blustry zen buddhists",@"barking tiny dogs", @"closeted bigot", @"yowling alley cats",@"shrugging teenagers",@"piece of tangled string", nil];
// and here's what I was missing!!
[five retain];
}
-(id)getOne:(NSArray *)myArray
// returns random element from an array
{
return [[myArray objectAtIndex:arc4random()%myArray.count]stringByAppendingString:@"\n"];
}
因此,我之前的问题显然涉及到没有保留我正在填充的数组。我猜它在被传递出该方法后立即被转储,因此不能用于从数组中拾取随机对象的后续方法
这很好。我试图通过在标题或其他地方声明它来实现这一点,但是如果我在一个地方声明它,然后尝试稍后填充它(在fillArrays方法中),我会遇到exec崩溃。我猜测是因为如果我不使用arrayWithObjects同时声明和填充,我的指针似乎指向一个随机的内存块。再一次,我在这方面是新手,但这似乎是正在发生的事情…它崩溃了,因为数组是自动释放的。您应该使用
alloc/initWithObjects:
而不是arrayWithObjects:
arrayWithObjects被认为是一种“工厂”方法;我试图通过在头或其他地方声明它来实现这一点,但是如果我在一个地方声明它,然后尝试在以后填充它(在fillArrays方法中),我会得到一个exec崩溃。我猜测是因为如果我不使用arrayWithObjects同时声明和填充,我的指针似乎指向一个随机的内存块。再一次,我在这方面是新手,但这似乎是正在发生的事情…它崩溃了,因为数组是自动释放的。您应该使用alloc/initWithObjects:
而不是arrayWithObjects:
arrayWithObjects被认为是一种“工厂”方法;一个天生就和记忆打交道的人,或者我是这么理解的。。。那么,我可以如何处理返回的值呢?我不确定,因为我在一个方法(awakeFromNib)中调用该方法,该方法似乎没有返回任何内容(即,一个void)。在程序开始时填充数组的正确方法是什么?谢谢。啊。。。那么,我可以如何处理返回的值呢?我不确定,因为我在一个方法(awakeFromNib)中调用该方法,该方法似乎没有返回任何内容(即,一个void)。在程序开始时填充数组的正确方法是什么?谢谢