我检查过谷歌,但我找不到任何有用的东西。 我在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
这让我相信它并没有推动对象,我做错了什么?
答案 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'。