为什么在调用viewDidLoad:之后我的Objective-C对象被释放?

时间:2016-07-08 10:12:31

标签: ios objective-c cocoa memory-management lifecycle

在Cocoa

中的viewDidLoad:方法之后创建的对象已解除分配

请参阅以下代码:

#import "ShowTableViewController.h"

@interface ShowTableViewController ()

@property NSArray *data;

@end

@implementation ShowTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.data = @[@"One", @"Two", @"Three"];
    NSLog(@"%ld",self.data.count);
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    NSLog(@"%ld",self.data.count);
    return self.data.count;
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    return self.data[row];
}

@end

输出
3
0

我使用断点检查执行顺序viewDidLoad首先被调用! 我使用awakeFromNib方法解决了这个问题。但我想知道为什么会这样 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

在像这样分配数组后,您需要在tableView中重新加载viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    self.data = @[@"One", @"Two", @"Three"];
    [self.tableView reloadData];
    NSLog(@"%ld",self.data.count);
}

这解决了我的问题,希望它也能解决你的问题。

答案 1 :(得分:0)

我总是不得不反对。一个在界面构建器中,另一个由我在代码中创建。该对象未被取消分配。第二个对象被指定为数据源,因此它返回零。这是我的一个诚实的错误。抱歉浪费你的时间。谢谢大家的答案:)

答案 2 :(得分:-1)

尝试将您的数据属性声明为强大的

@property NSArray * data;

变为

@property(强)NSArray *数据;