Невозможно добавить объект в NSMutableArray - PullRequest
0 голосов
/ 01 июля 2010

Я проверил Google и не нашел ничего, что могло бы помочь.Я пишу класс стека в Objective-C, стек основан на NSMutableArray, однако я не могу добавить к нему какие-либо объекты, он не выдает никаких ошибок в консоли, и нет предупреждений / ошибок компиляции.Вот мой код для стекового объекта.

#import "Stack.h"

@implementation Stack
@synthesize stack;

- (id)init {
    self.stack = [[NSMutableArray alloc] init];
    return self;
}

- (void)push:(id)object { [self.stack addObject:object]; }

- (int)size { return [self.stack count]; }

- (id)pop {
    id obj = [[[self.stack lastObject] retain] autorelease];
    [self.stack removeLastObject];
    return obj;
}

- (id)peek { return [self.stack lastObject]; }

@end

Заголовок:

#import <Cocoa/Cocoa.h>

@interface Stack : NSObject {
    NSMutableArray *stack;
}

- (void)push:(id)object;
- (int)size;
- (id)pop;
- (id)peek;

@property (nonatomic, retain) NSMutableArray *stack;

@end

Для остальной части кода, если я вызываю [test_stack size], он возвращает ноль, неважносколько раз я нажимаю на объект, и если я вызываю pop или peek, он просто возвращает (null).

#import "TRIAL_Stack_Ctrl.h"


@implementation TRIAL_Stack_Ctrl
@synthesize test;

- (IBAction)push:(id)sender {
    [test_stack push:[input stringValue]];
}
- (IBAction)pop:(id)sender {
    [label setStringValue:[NSString stringWithFormat:@"%@", [test_stack pop]]];
}
- (IBAction)peek:(id)sender {
    [label setStringValue:[NSString stringWithFormat:@"%@", [test_stack peek]]];
}
- (IBAction)size:(id)sender {
    [label setStringValue:[NSString stringWithFormat:@"%d", [test_stack size]]];
}

@end

Это заставляет меня поверить, что это не нажатие на объект, я что-то делаюне так?

Ответы [ 5 ]

2 голосов
/ 01 июля 2010

Изменение:

- (id)init {
    self.stack = [[NSMutableArray alloc] init];
    return self;
}

до:

- (id)init {
    self = [super init];
    if (self) {
        stack = [[NSMutableArray alloc] init];
    }
    return self;
}
1 голос
/ 02 июля 2010

Это заставляет меня поверить, что это не толкает объект, я что-то не так делаю?

Неверное предположение. removeLastObject создает исключение NSRangeException, если в изменяемом массиве нет объектов. Если вы не видите исключения диапазона, при попытке открыть пустой стек сам стек должен быть равен нулю.

1 голос
/ 02 июля 2010

Если это действительно полная реализация вашего TRIAL_Stack_Ctrl класса, вы нигде не назначаете переменную экземпляра стека тестирования, поэтому она равна nil.

1 голос
/ 02 июля 2010

Помимо утечки NSMutableArray и ненужного использования self.stack, все выглядит нормально.Поэтому, похоже, ваша проблема, вероятно, в классе TRIAL_Stack_Ctrl, которому вы не показываете код.

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

- (void)push:(id)object {
  NSParameterAssert(object);
  [stack addObject:object];
  NSAssert([stack count], @"array is empty");
}

Они ничего не компилируют в коде релиза.

0 голосов
/ 02 июля 2010

Можем ли мы увидеть .h для реализации? Я вижу, что вы синтезируете что-то под названием «test», но все операции выполняются над чем-то под названием «test_stack». Проблема с именами? Если так, то это, вероятно, также должно быть «self.test_stack».

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