无法将对象添加到NSMutableArray

时间:2010-07-01 17:49:33

标签: objective-c cocoa macos

我检查过谷歌,但我找不到任何有用的东西。 我在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 个答案:

答案 0 :(得分:2)

更改:

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

为:

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

答案 1 :(得分:1)

除了泄漏NSMutableArray以及不必要地使用self.stack之外,它看起来还不错。所以看来你的问题可能在TRIAL_Stack_Ctrl类中,你没有显示代码。

如果您觉得自己疯了,断言可以帮助您了解正在发生的事情。

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

他们在发布代码中编译为空。

答案 2 :(得分:1)

如果这真的是你的TRIAL_Stack_Ctrl类的完整实现,那你就不会在任何地方分配测试堆栈实例变量,所以它是零。

答案 3 :(得分:1)

  

这让我相信它并没有推动对象,我做错了什么?

不正确的假设。如果可变数组中没有对象,则removeLastObject会抛出NSRangeException。如果没有看到范围异常,当您尝试弹出空堆栈时,堆栈本身必须为零。

答案 4 :(得分:0)

我们能看到.h的实施吗?我看到你正在综合一个叫做'test'的东西,但是所有的操作都是在'test_stack'上完成的。命名问题?如果是这样,它可能也应该是'self.test_stack'。