Objective c NSMutableArray为空
我有一个NSViewController子类,具有: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] (
@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]…你可以发布这个类的接口代码吗?我可以