Objective c 无法将对象添加到NSMutableArray
我查过谷歌,没有找到任何有用的东西。 我正在Objective-C中编写一个堆栈类,该堆栈基于NSMutableArray,但是,我无法向其中添加任何对象,它不会在控制台中抛出任何错误,并且没有编译警告/错误。这是我的堆栈对象代码Objective c 无法将对象添加到NSMutableArray,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我查过谷歌,没有找到任何有用的东西。 我正在Objective-C中编写一个堆栈类,该堆栈基于NSMutableArray,但是,我无法向其中添加任何对象,它不会在控制台中抛出任何错误,并且没有编译警告/错误。这是我的堆栈对象代码 #import "Stack.h" @implementation Stack @synthesize stack; - (id)init { self.stack = [[NSMutableArray alloc] init]; return s
#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
这让我相信它没有推动物体,我有什么做错了吗?改变:
- (id)init {
self.stack = [[NSMutableArray alloc] init];
return self;
}
致:
更改:
- (id)init {
self.stack = [[NSMutableArray alloc] init];
return self;
}
致:
除了泄漏NSMutableArray和不必要地使用
self.stack
,它看起来还可以。因此,您的问题似乎可能是在您没有向其显示代码的试用\u Stack\u Ctrl类中
如果你觉得自己快要发疯了,那么断言可以帮助你弄清到底发生了什么
- (void)push:(id)object {
NSParameterAssert(object);
[stack addObject:object];
NSAssert([stack count], @"array is empty");
}
它们在发布代码中编译为零。除了泄漏NSMutableArray,以及不必要地使用
self.stack
,它看起来还可以。因此,您的问题似乎可能是在您没有向其显示代码的试用\u Stack\u Ctrl类中
如果你觉得自己快要发疯了,那么断言可以帮助你弄清到底发生了什么
- (void)push:(id)object {
NSParameterAssert(object);
[stack addObject:object];
NSAssert([stack count], @"array is empty");
}
它们在发布代码中编译为零。我们可以看到实现的.h吗?我看到你正在合成一个叫做“test”的东西,但是所有的操作都是在一个叫做“test_stack”的东西上完成的。命名问题?如果是这样,它可能也应该是“self.test_stack”。我们可以看到实现的.h吗?我看到你正在合成一个叫做“test”的东西,但是所有的操作都是在一个叫做“test_stack”的东西上完成的。命名问题?如果是这样,它可能也应该是“self.test_stack”。如果这真的是
TRIAL_stack\u Ctrl
类的完整实现,那么您没有在任何地方分配test stack实例变量,所以它是零。如果这真的是TRIAL_stack\u Ctrl
类的完整实现,您没有在任何地方分配测试堆栈实例变量,因此它是nil
这让我相信它没有推动物体,我做错了什么吗
错误的假设。如果可变数组中没有对象,RemovelAsObject将抛出NSRangeException。如果您没有看到范围异常,当您尝试弹出空堆栈时,堆栈本身必须为零
这让我相信它没有推动物体,我做错了什么吗
错误的假设。如果可变数组中没有对象,RemovelAsObject将抛出NSRangeException。如果您没有看到范围异常,当您尝试弹出空堆栈时,堆栈本身必须为nil。尽管这是标准的操作方式,[NSObject init]只返回self,并且如果self为nil,则永远不会调用init。基本上,他所做的是可以的,因为他直接从NSObject继承。此外,他不应该在init方法中使用访问器。@Jared P:更改了访问器的使用。我不确定将
self
设置到创建的实例的确切位置。我怀疑当从-init
方法返回时,self
将是nil
,因为他没有在super
上调用此方法。听起来他确实在调用nil
而不是他的Stack
class.self的一个实例。从这个意义上说,self不是“get set”,它是方法的一个隐藏参数,实际上只是一个常规的C函数,在声明的参数之前有两个隐式的额外参数(id self,SEL\u cmd)。基本上,self是在调用方法之前设置的。objc运行时检查消息的目标(可能是自变量)是否为nil,如果为nil,则不传递消息。因此,赛尔夫在输入任何objective-c方法时都不可能是零。@Jared:他所做的不好。NSObject中的-init只返回self这一事实是一个实现细节。苹果没有理由不在未来的可可发布中改变这一点。然而,这并不是问题的原因。@JermyP:-[NSObject init]返回的self在NSObject的类引用中记录得非常清楚,所以我很难将其称为实现细节。另外,@Johan和我显然只是在为约定争吵——我们知道这不是问题——虽然这是做事的标准方式,[NSObject init]除了返回self之外什么都不做,如果self为nil,则永远不会调用init。基本上,他所做的是可以的,因为他直接从NSObject继承。此外,他不应该在init方法中使用访问器。@Jared P:更改了访问器的使用。我不确定将self
设置到创建的实例的确切位置。我怀疑当从-init
方法返回时,self
将是nil
,因为他没有在super
上调用此方法。听起来他确实在调用nil
而不是他的Stack
class.self的一个实例。从这个意义上说,self不是“get set”,它是方法的一个隐藏参数,实际上只是一个常规的C函数,在声明的参数之前有两个隐式的额外参数(id self,SEL\u cmd)。基本上,self是在调用方法之前设置的。objc运行时检查消息的目标(可能是自变量)是否为nil,如果为nil,则不传递消息。因此,赛尔夫在输入任何objective-c方法时都不可能是零。@Jared:他所做的不好。NSObject中的-init只返回self这一事实是一个实现细节。苹果没有理由不在未来的可可发布中改变这一点。然而,这并不是问题的原因。@JermyP:-[NSObject init]返回的self在NSObject的类引用中记录得非常清楚,所以我很难将其称为实现细节。另外,@Johan和我显然只是在为惯例争吵--