Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法将对象添加到NSMutableArray_Objective C_Cocoa_Macos - Fatal编程技术网

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

我查过谷歌,没有找到任何有用的东西。 我正在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
这让我相信它没有推动物体,我有什么做错了吗?

改变:

- (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和我显然只是在为惯例争吵--