NSMutableArray + добавление UIImageView - очень просто, но не работает - arghh help - PullRequest
0 голосов
/ 25 февраля 2011

Я динамически создаю изображения (небольшого значка бургера, к вашему сведению) и хочу отслеживать их с помощью изменяемого массива. Я объявляю массив в моем заголовке как:

NSMutableArray *myBurgers;

И инициализировать мой массив в моем viewDidLoad

NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];

Вот мой метод для создания изображений и помещения в массив - в настоящее время мой счетчик массивов возвращает 0 - и у меня есть ошибка компилятора, говорящая 'Unused variable' myburgers '

-(void)burgerManGo:(CGPoint)location {

   burgerCount=burgerCount++;

    if(location.x<=(320) && location.y<=(480)){

    CGRect myImageRect = CGRectMake(location.x, location.y, 65, 55); 
    UIImageView *myNewBurger = [[UIImageView alloc] initWithFrame:myImageRect]; 
    [myNewBurger setImage:[UIImage imageNamed:@"burgerMan.png"]];
    myNewBurger.opaque = YES; // explicitly opaque for performance 
    [self.view addSubview:myNewBurger];

    //but adding to my array doesn't seem to work...
    [myBurgers addObject: myNewBurger];

    //because this always come back as 0
    NSLog(@"Array Size: %ld", [myBurgers count]);       

    } 

}

Любая помощь, как всегда, очень ценится.

Mickey.

Ответы [ 5 ]

2 голосов
/ 25 февраля 2011

Вы не должны создавать массив с емкостью 0!Он мгновенно изменит размер при первом добавлении в него чего-либо.Вы можете просто позвонить [NSMutableArray array], чтобы получить массив начальной емкости по умолчанию.

Что касается вашей реальной проблемы: из того, что вы написали, вы объявляете переменную new внутри viewdidLoadназывается myBurger.т.е. в viewDidLoad у вас должно быть:

self.myBurgers = [NSMutableArray array];

, а не:

NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];

Обратите внимание, что self.myBurger = приведет к сохранению вашего нового массива (при условии, что вы определили свойство myBurgersсохранить, а не назначить) - то, что вы хотите.Не забудьте [myBurgers release] в dealloc.

1 голос
/ 25 февраля 2011

Вы должны сохранить массив, созданный вами в viewDidLoad :, теперь у вас есть автоматически выпущенный объект, и он исчезнет после цикла запуска.

Do:

NSMutableArray* myBurgers = [[NSMutableArray arrayWithCapacity:0] retain];
0 голосов
/ 25 февраля 2011

Если я правильно вас понимаю, ваш класс объявляет переменную экземпляра следующим образом:

NSMutableArray *myBurgers;

Затем вы переопределяете viewDidLoad следующим образом:

- (void)viewDidLoad
{
    // ...
    NSMutableArray *myBurgers = [NSMutableArray arrayWithCapacity:0];
    // ...
}

Если этоВ этом случае ваш viewDidLoad метод объявляет локальную переменную myBurgers, которая временно маскирует переменную экземпляра с тем же именем.Затем вы присваиваете автоматически освобожденный массив локальной переменной.Массив освобождается вскоре после возврата из viewDidLoad, но в любом случае он никогда не присваивается переменной экземпляра.

Чтобы исправить это, переписайте свой метод viewDidLoad следующим образом:

- (void)viewDidLoad
{
    // ...
    myBurgers = [[NSMutableArray alloc] init];
    // ...
}

Нет смысла автоматически высвобождать объекты, которые вы назначаете переменным экземпляра;вместо этого используйте alloc и соответствующий метод init....Кроме того, как отмечал предыдущий автор, инициализация изменяемого массива с нулевой емкостью довольно бессмысленна.Либо используйте конкретную ненулевую емкость (если вы заранее знаете, сколько элементов будет содержать массив), либо используйте значение по умолчанию.

0 голосов
/ 25 февраля 2011

Имейте ввиду, что

NSMutableArray* myBurgers = [NSMutableArray arrayWithCapacity:0];

- это автоматически высвобождаемый объект

-(void)viewDidLoad {

 myBurgers = [[NSMutableArray alloc]initWithCapacity:kMaxBurgersQty];



}

-(void)dealloc {
   [myBurgers release];
   myBurgers = nil;
}

Это даст гарантию, что массив бургеров не будет автоматически выпущен где-то в середине выполнения.

0 голосов
/ 25 февраля 2011

Вы создаете новый экземпляр в viewDidLoad вместо назначения члену интерфейса.

...