OBJ C заполнение массивов в awakefromnib - вопрос объема? - PullRequest
0 голосов
/ 21 мая 2010

Я пытаюсь заполнить массив, вызванный из awakeFromNib. Моя проблема в том, что переменная не видна, когда я пытаюсь получить к ней доступ.

Вот соответствующий фрагмент:

   -(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"];
}

Буду признателен за любую помощь, которую вы могли бы оказать этому новичку. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 мая 2010

Ваш метод fillArrays создает новый локальный NSArray и затем возвращает его. Однако вы вызываете этот метод примерно так:

[self fillArrays];

Проблема в том, что вы полностью игнорируете возвращаемое значение, что означает, что ваш массив теряется в небольшой пустоте, которая существует между кадрами стека.

1 голос
/ 21 мая 2010

five не является переменной экземпляра, поэтому она видна только в fillArrays.Вы должны сделать five переменной экземпляра.

0 голосов
/ 27 мая 2010

OK.

Отвечая на мой собственный вопрос, но, возможно, это поможет кому-то еще.

Вот соответствующий код, чем я закончил:

-(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"];
}

Итак, моя более ранняя проблема, по-видимому, заключалась в не в сохранении массива, который я заполнял. Я думаю, он сбрасывался сразу после того, как был передан из метода, и поэтому не мог использоваться в более позднем методе выбрал случайный объект из массива.

Это отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...