Основной вопрос Objective-C ... сводит меня с ума - PullRequest
1 голос
/ 25 апреля 2009

Прошло много времени с тех пор, как я занимался программированием. Раньше нормально читал C & C ++ ... никогда много не писал.

У меня есть чрезвычайно простой класс, который я хочу использовать для управления содержимым массива (используя NSMutableArray). Массив должен сохраняться как объект, чтобы я мог вносить в него несколько обновлений за один прогон моей программы (пока не беспокоюсь о сохранении данных о состоянии на диск)

Вот моя проблема. Мне неясно, где и когда я должен выделять / инициализировать мой объект Array, чтобы он находился в рабочем состоянии при каждом нажатии кнопки в представлении моего iPhone.

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

  1. Я пытался просто ссылаться на переменную экземпляра массива в методе, который я написал как часть того же класса. Нет Alloc / Init нигде в этой версии кода. Когда я вызываю функцию addObject, происходит сбой, поскольку объект массива не был выделен / инициализирован.

  2. Я также пытался выделить / инициализировать экземпляр моего массива в методе viewWillDisplay. Компилятор Xcode жалуется, что мой недавно выделенный объект никогда не используется.

  3. Для ударов я сделал alloc / init в рамках метода «нажатия кнопки», который я пишу ... но, конечно, он выделяет новый экземпляр каждый раз, когда я нажимаю кнопку.

Вот что у меня есть в файлах .h и .m для моего примера (здесь показан сценарий 1)

Был бы очень признателен, если бы кто-то мог заполнить бланк GIANT. Я, очевидно, понял, как предполагается использовать объекты Instance Variable. (Я прочитал множество документов по Apple на Obj-C ... и т. Д. Также погуглил мои мозги, пытаясь найти объяснение.

.h:

#import <UIKit/UIKit.h>

@interface ArrayManagerViewController : UIViewController {
    NSMutableArray *buttonArray;
}
- (IBAction)buttonClicked:(id)sender;

@end

и .m

#import "ArrayManagerViewController.h"

@implementation ArrayManagerViewController

- (IBAction) buttonClicked:(id)sender {
    NSString *senderTitle = [sender currentTitle];
    int intSenderTitle = [senderTitle intValue];
    [buttonArray insertObject:[NSString stringWithFormat:@"%d",
                                                         intSenderTitle]
                      atIndex:intSenderTitle];

    for (id obj in buttonArray)
        NSLog(@"Object Value %@", obj);
}

Ответы [ 3 ]

3 голосов
/ 25 апреля 2009

Если ваш массив используется в течение всего времени жизни вашего ViewController, вы, вероятно, можете выделить / инициализировать массив в методе ArrayManagerViewController init (override) и вызвать release в переопределении dealloc.

@implementation ArrayManagerViewController

- (ArrayManagerViewController *) init
{
    if (self = [super init])
    {
        [[buttonArray alloc] init];
    }

    // handle errors...

    return self;
}

- (void)dealloc
{
    [buttonArray release];
    [super dealloc];
}

// other methods

@end
1 голос
/ 25 апреля 2009

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

сообщение, которое инициализирует UIViewController: (обычно)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

так что ваша реализация будет

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
       // Custom initialization
       buttonArray = [[NSMutableArray alloc] init];
    }
    return self;
}

и не забудьте отпустить свой buttonArray в сообщении dealloc

- (void) dealloc {
    [buttonsArray release];
    [super dealloc];
}

P.S .: просто прочитайте основы ObjC и управление памятью какао на developer.apple.com, прежде чем начинать писать код

1 голос
/ 25 апреля 2009

Хорошо, Objective C может немного раздражать, потому что у вас есть в основном два вида синтаксиса, C и Smalltalk. Вам нужно создать свой массив с кодом что-то вроде

buttonArray = [[NSMutableArray alloc] init] ;

Вот хороший легкий учебник здесь .

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