Создать панель инструментов для приложения викторины - PullRequest
0 голосов
/ 16 марта 2011

Это связано с вопросом, который я опубликовал ранее. Я все еще застрял на нем. Вот описание. Я создаю приложение для викторины. У него есть панель инструментов, кнопки которой создаются динамически при каждом нажатии пользователем кнопки. Я сделал это с помощью метода, который добавляет три кнопки в массив, затем использует цикл for, чтобы проверить количество вариантов ответа на вопрос, а затем создал и добавил кнопку в массив для каждого варианта. Позже я использую
[toolbar setitems:tempArray];

чтобы добавить кнопки


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

У меня тоже есть другой вопрос

Есть ли способ узнать количество сохраненных объектов, созданных встроенными методами в iphone sdk.Specificaly,

1) Увеличивает ли метод addobject объекта NSMutableArray счетчик добавленного объекта 2) Вероятно ли, что [релиз элементов панели инструментов] вызовет проблемы, если я собираюсь освободить хранящиеся в нем объекты customBarButtonItem?

, так как, когда вы играете с этими опциями, приложение либо сразу падает, либо изменения не влияют на обнаруженные утечки

вот код. В нем есть много строк комментариев, которые я попробовал
- (void)CreateButtons{</p> <pre><code> UIToolbar *tempToolBar=[[UIToolbar alloc] ] numberOfChoices=0;//set number of choice buttons at present to 0 NSMutableArray *tempItems=[[NSMutableArray alloc] init];//Array for holding the buttons Question *question=[currentQuestion question]; NSString *answer=[question answerOptions]; int numericAnswer=0; numericAnswer=[answer characterAtIndex:0]; //see if its a number or a character if (numericAnswer > 96) { // its a character int choice; for (choice=97; choice <=numericAnswer ; choice ++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setBackgroundImage:[UIImage imageNamed:@"gembtnblu.png"] forState:UIControlStateNormal]; button.frame = CGRectMake(0, 0, TOOLBAR_BUTTON_WIDTH , TOOLBAR_BUTTON_HEIGHT); [button setTitle:[NSString stringWithFormat:@"%c",(char)choice] forState:UIControlStateNormal]; [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(ChoiceButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; [button setTag:choice]; UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; if (isReviewing == TRUE) { customBarItem.customView.userInteractionEnabled=FALSE; } //Add button to the array [tempItems addObject:customBarItem]; //release buttons [customBarItem release]; numberOfChoices++; } } else { int choice; for (choice=49; choice<=numericAnswer; choice ++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setBackgroundImage:[UIImage imageNamed:@"gembtnblu.png"] forState:UIControlStateNormal]; button.frame = CGRectMake(0, 0, TOOLBAR_BUTTON_WIDTH , TOOLBAR_BUTTON_HEIGHT); [button setTitle:[NSString stringWithFormat:@"%c",choice] forState:UIControlStateNormal]; [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(ChoiceButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; [button setTag:choice]; UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; //Add button to the array [tempItems addObject:customBarItem]; if (isReviewing == TRUE) { customBarItem.customView.userInteractionEnabled=FALSE; } //release buttons [customBarItem release]; numberOfChoices++; } } //load the image UIButton *previousButton = [UIButton buttonWithType:UIButtonTypeCustom]; [previousButton setBackgroundImage:[UIImage imageNamed:@"prev.png"] forState:UIControlStateNormal]; [previousButton addTarget:self action:@selector(PreviousClicked:) forControlEvents:UIControlEventTouchUpInside]; previousButton.frame = CGRectMake(0, 0, TOOLBAR_BUTTON_WIDTH , TOOLBAR_BUTTON_HEIGHT); UIBarButtonItem *customBarItem6 = [[UIBarButtonItem alloc] initWithCustomView:previousButton]; //[previousButton release]; self.prevButton=customBarItem6; UIButton *nextButton= [UIButton buttonWithType:UIButtonTypeCustom]; [nextButton setBackgroundImage:[UIImage imageNamed:@"nex.png"] forState:UIControlStateNormal]; [nextButton addTarget:self action:@selector(nextClicked:) forControlEvents:UIControlEventTouchUpInside]; nextButton.frame = CGRectMake(0, 0, TOOLBAR_BUTTON_WIDTH, TOOLBAR_BUTTON_HEIGHT); UIBarButtonItem *customBarItem7 = [[UIBarButtonItem alloc] initWithCustomView:nextButton]; //[nextButton release]; //Use this to put space in between your toolbox buttons UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; [tempItems addObject:flexItem]; [tempItems addObject:customBarItem6]; [tempItems addObject:customBarItem7]; //release buttons [customBarItem6 release]; [customBarItem7 release]; [flexItem release]; //NSArray *items=[[NSArray alloc] initWithArray:(NSArray *)tempItems]; //[tempItems release]; //add array of buttons to toolbar //if([[toolbar items] count]>0)

// { // [[элементы панели инструментов] release]; //} [setItems панели инструментов: tempItems animated: YES]; // [items release]; //[self.view addSubview: панель инструментов]; if (isReviewing == FALSE && isPractice == FALSE) {

    prevButton.enabled=FALSE;
}
//[toolbar bringSubviewToFront:customBarItem6.customView];

}

панель инструментов создается через ib

Да, кода много, но он просто создает кнопки на основе количества вариантов ответа на вопрос. Два цикла for аналогичны, за исключением того, что один нажимает кнопки a, b, c, d, а другой - 1,2. , 3,4 ..... Кроме того, создаются три кнопки. Один для следующего, предыдущего и гибкий элемент. Этот метод вызывается каждый раз, когда пользователь нажимает следующую кнопку.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Я вижу несколько вещей, которые не очень эффективны с точки зрения памяти:

  1. Вы используете множество удобных инициализаторов: buttonWithType и 'imageNamed`.Они будут автоматически освобождаться в какой-то момент в будущем, но не в вашем методе.
  2. Элемент tempToolbar выделен, но никогда не освобождается.Это приведет к утечке.
  3. Ваш изменяемый массив tempItems также не будет освобожден: это убьет вас полностью, так как все ваши кнопки добавлены в него ...

На основепо этому поводу я бы предложил:

  1. Использование методов alloc / init вместо конструкторов удобства
  2. В качестве альтернативы: создайте NSAutoReleasePool в начале вашего метода и drain вконец: это освободит все автоматически выпущенные сущности.

Удачи

0 голосов
/ 16 марта 2011

Трудно следовать всему этому коду, но простой ответ на 1) таков, что да, [NSMutableArray addObject:] увеличение сохраняет + 1.

...