Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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/8/xcode/7.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_Xcode_Cocoa_Nsmutablearray_Nsviewcontroller - Fatal编程技术网

Objective c NSMutableArray为空

Objective c NSMutableArray为空,objective-c,xcode,cocoa,nsmutablearray,nsviewcontroller,Objective C,Xcode,Cocoa,Nsmutablearray,Nsviewcontroller,我有一个NSViewController子类,具有: @property (retain) NSMutableArray* entities; @property (retain) NSMutableArray* tiles; 在我的-init方法中,两个数组都是使用+new创建的,并且每个数组都有一个对象。之后,我调用NSLog(@“%@,%@”,实体,tile),它给了我预期的结果: 2012-12-30 15:07:04.160 Project Land III[2177:303] (

我有一个NSViewController子类,具有:

@property (retain) NSMutableArray* entities;
@property (retain) NSMutableArray* tiles;
在我的
-init
方法中,两个数组都是使用
+new
创建的,并且每个数组都有一个对象。之后,我调用
NSLog(@“%@,%@”,实体,tile),它给了我预期的结果:

2012-12-30 15:07:04.160 Project Land III[2177:303] (
"<RBEntity: 0x100508170>"
), (
"<RBTile: 0x100508470>"
)
2012-12-30 15:07:04.160 Project Land III[2177:303] (
    "<RBEntity: 0x100508170>"
), (
    "<RBTile: 0x100508470>"
)
我在这个问题上以某种形式纠缠了好几天。为什么数组是空的

我非常乐意发布更多的代码,请告诉我

接口:

#import <Cocoa/Cocoa.h>
#import "RBEntity.h"
#import "RBTile.h"

@interface RBMainViewController : NSViewController {
    NSMutableArray* _entities;
    NSMutableArray* _tiles;
}

@property (retain) NSMutableArray* entities;
@property (retain) NSMutableArray* tiles;

- (IBAction)log:(id)sender;

@end

我相信在处理类中的那些对象时,您需要使用
self.entites
self.tiles

编辑(添加界面后)

您需要在界面中包含以下内容:

@interface RBMainViewController : NSViewController{
    NSMutableArray* _entities;
    NSMutableArray* _tiles;
}

@property (retain) NSMutableArray* entities;
@property (retain) NSMutableArray* tiles;

- (IBAction)log:(id)sender;

@end
然后,您需要将以下内容添加到实现中:

@synthesize entities = _entities;
@synthesize tiles = _tiles;

我相信在处理类中的那些对象时,您需要使用
self.entites
self.tiles

编辑(添加界面后)

您需要在界面中包含以下内容:

@interface RBMainViewController : NSViewController{
    NSMutableArray* _entities;
    NSMutableArray* _tiles;
}

@property (retain) NSMutableArray* entities;
@property (retain) NSMutableArray* tiles;

- (IBAction)log:(id)sender;

@end
然后,您需要将以下内容添加到实现中:

@synthesize entities = _entities;
@synthesize tiles = _tiles;

为其中一个属性编写一个自定义getter/setter,并在那里放置一个断点以查看谁在重置该值。如果这没有发现问题,并且您的属性仍在重置,那么您可能是从您的
NSViewController
实例访问它们,该实例尚未由
init
初始化,因此这些属性始终未初始化。

为其中一个属性编写自定义getter/setter,然后在那里放一个断点,看看谁在重置值。如果这没有发现问题,并且您的属性仍在重置中,则您可能是从
NSViewController
的实例访问这些属性,该实例尚未由
init
初始化,因此这些属性始终未初始化

在我的
-init
方法中,两个数组都是使用
+new
创建的,并且每个数组都有一个对象。之后,我调用
NSLog(@“%@,%@”,实体,tile),它给了我预期的结果:

2012-12-30 15:07:04.160 Project Land III[2177:303] (
"<RBEntity: 0x100508170>"
), (
"<RBTile: 0x100508470>"
)
2012-12-30 15:07:04.160 Project Land III[2177:303] (
    "<RBEntity: 0x100508170>"
), (
    "<RBTile: 0x100508470>"
)
这是一个非常常见的新手错误

您有两个RBMainViewController对象。其中一个,您可能是在另一个.m文件的代码中创建的,方法是说类似于
[[RBMainViewController alloc]init]
。另一个是在nib中创建的,可能是通过将其拖动到nib中

(注意:您在中创建VC的nib不是VC的nib。如果VC的nib中包含加载nib的VC,那么这将是循环的。没有数组的VC驻留在nib A中,每个VC将加载nib。)

在nib中创建的VC是其视图显示在屏幕上的VC。因为该对象从未收到
init
消息(它是用其他
initWith…
消息初始化的),所以您从未创建过它的数组。您使用
init
创建的视图控制器(它有自己的数组)在屏幕上不可见(否则您会单击它的按钮,而不是其他按钮,并且您会在输出中看到数组)

解决方案涉及两个变化

第一个是将
init
的实现改为
initWithNibName:bundle:
的实现。像这样:

- (instancetype) initWithNibName:(NSString *)nibName
    bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:nibName bundle:bundle];
    if (self != nil) {
        <#...#>
    }
    return self;
}
您还需要删除两个视图控制器中的一个。我们需要查看代码和nib才能知道是哪个。如果删除在代码中创建的插座,可能需要在该类中创建一个插座,并将其连接到nib中。如果删除nib中的一个,即在该nib中建立的与VC的任何出口连接,则需要在代码中重新创建

在我的
-init
方法中,两个数组都是使用
+new
创建的,并且每个数组都有一个对象。之后,我调用
NSLog(@“%@,%@”,实体,tile),它给了我预期的结果:

2012-12-30 15:07:04.160 Project Land III[2177:303] (
"<RBEntity: 0x100508170>"
), (
"<RBTile: 0x100508470>"
)
2012-12-30 15:07:04.160 Project Land III[2177:303] (
    "<RBEntity: 0x100508170>"
), (
    "<RBTile: 0x100508470>"
)
这是一个非常常见的新手错误

您有两个RBMainViewController对象。其中一个,您可能是在另一个.m文件的代码中创建的,方法是说类似于
[[RBMainViewController alloc]init]
。另一个是在nib中创建的,可能是通过将其拖动到nib中

(注意:您在中创建VC的nib不是VC的nib。如果VC的nib中包含加载nib的VC,那么这将是循环的。没有数组的VC驻留在nib A中,每个VC将加载nib。)

在nib中创建的VC是其视图显示在屏幕上的VC。因为该对象从未收到
init
消息(它是用其他
initWith…
消息初始化的),所以您从未创建过它的数组。您使用
init
创建的视图控制器(它有自己的数组)在屏幕上不可见(否则您会单击它的按钮,而不是其他按钮,并且您会在输出中看到数组)

解决方案涉及两个变化

第一个是将
init
的实现改为
initWithNibName:bundle:
的实现。像这样:

- (instancetype) initWithNibName:(NSString *)nibName
    bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:nibName bundle:bundle];
    if (self != nil) {
        <#...#>
    }
    return self;
}

您还需要删除两个视图控制器中的一个。我们需要查看代码和nib才能知道是哪个。如果删除在代码中创建的插座,可能需要在该类中创建一个插座,并将其连接到nib中。如果删除nib中的一个,即在该nib中建立的与该VC的任何出口连接,则需要在代码中重新创建。

设置和获取?是。我将发布我的
-init
方法。为什么访问实例变量会直接导致此问题?对于设置和获取?是的。我将发布我的
-init
方法。为什么访问实例变量会直接导致这个问题?你可以发布这个类的接口代码吗?我可以看到你没有[super init]…你可以发布这个类的接口代码吗?我可以