数组属性为零,尽管有强大的属性引用

时间:2014-02-21 09:01:27

标签: objective-c macos automatic-ref-counting

抱歉这个愚蠢的问题。这是我第一次使用ARC,我有点困惑。

我声明我的财产很强大:

@property (nonatomic, strong) NSMutableArray *dataArray;

我在init上填写了一些测试数据:

- (id)initWithWindowNibName:(NSString *)windowNibName {
    self = [super initWithWindowNibName:windowNibName];
    if (self) {

        self.dataArray = [[NSMutableArray alloc] init];

        [self.dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"First name", @"Set", @"First set", @"Editiion", @"First edition", nil]];
        [self.dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"Second name", @"Set", @"Second set", @"Editiion", @"Second edition", nil]];
        [self.dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"Third name", @"Set", @"Third set", @"Editiion", @"Third edition", nil]];
    }
    return self;

当我使用它时,self.dataArraynil

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return self.dataArray.count;
}

我做错了什么,我以为这个属性会在我的对象的生命中被保留?

4 个答案:

答案 0 :(得分:3)

我认为您应该尝试将数组初始化放在- (void)awakeFromNib中。 关于此的Apple文件:

Classes can implement this method to initialize state information after objects have been loaded from an Interface Builder archive (nib file).

An awakeFromNib message is sent to each object loaded from the archive, but only if it can respond to the message, and only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet instance variables set.

在我写的最后一个应用程序中,我在awakeFromNib中设置了所有属性并且它正在工作。试试这个。

答案 1 :(得分:0)

添加以下代码,并设置断点:

- (void)setDataArray:(NSMutableArray *)array{
    _dataArray = array;
}

然后调试以检查调用set方法的所有位置。

答案 2 :(得分:0)

感谢Ivp提供修复,我写这个答案是为了更详细地说明问题发生的原因。

在界面构建器中,我无意中将我的类两次用于同一个xib。进入文件所有者后再进入对象列表。我的窗口被引用到文件的所有者,但是NSTableView的dataSource引用了对象列表中的那个。

这意味着我的班级正在创建两个实例。进入initWithWindowNibName之后:NSTableView再次调用其委托方法。

awakeFromNib:修复了问题,因为正在为两个实例设置数据。但是为了解决这个问题,我从 Objects 列表中删除了我的类,并将所有引用的Outlets和Actions重新连接到文件所有者。

答案 3 :(得分:-3)

试试这个

@interface ClassName()
{
   NSMutableArray *dataArray;
}
@end

-(id)initWithWindowNibName:(NSString *)windowNibName 
{
    self = [super initWithWindowNibName:windowNibName];
    if (self) {

       dataArray = [[NSMutableArray alloc] init];

       [dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"First name", @"Set", @"First set", @"Editiion", @"First edition", nil]];
       [dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"Second name", @"Set", @"Second set", @"Editiion", @"Second edition", nil]];
       [dataArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"Third name", @"Set", @"Third set", @"Editiion", @"Third edition", nil]];
    }
    return self;
}

不要生成dataArray属性。试试这个,希望这可能会有所帮助。