2

注意:此问题已根据以下答案中提供的建议进行了更新,以便更全面地了解问题的当前状态。

您可以在此处查看完整的项目文件:https ://github.com/cxx6xxc/Skeleton/blob/master/README.md

条件

  1. NSArray我在对象的init方法中创建了一个。

  2. 我用它的 get 方法返回 NSArray。

问题

到达后,NSArray 为空。

创建实例

尝试1:

这是我最初的实现。

- (id)init:
{
    labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];

    return self;    
}

尝试2:

Ismael 建议我用子类协议来包装它。

neo 建议我保留 NSArray。

- (id)init:
{
    self = [super init];
    if (self)
    {
        labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];

        [labels retain];
    }
    return self;
}

尝试 3:

Anoop Vaidya 建议我使用 alloc 和 NSMutableArray 强制所有权:

- (id)init:
{
    self = [super init];
    if (self)
    {
        labels = [[NSMutableArray alloc] initWithObjects:@"Red", @"Green", @"Blue", nil];
    }
    return self;
}

但是,当我返回对象时,尽管上面引用了不同的初始化建议......

返回对象

- (NSArray *)getLabels 
{
    return labels; 
}

...与 NSMutableArray ...

- (NSMutableArray *)getLabels 
{
    return labels; 
}

... NSArray getter 返回一个空对象。

调用方法

int main(void)
{
    id view;
    view = [ZZView alloc];

    id model;
    model = [ZZModel alloc];

    id controller;
    controller = [[ZZController alloc] init: model: view];

    labels = [[controller getModel] getLabels];

    if(labels)
        NSLog(@"allocated");
    else
        NSLog(@"not alloced");

    [view dealloc];
    [model dealloc];
    [controller dealloc];

    return EXIT_SUCCESS;
}

问题

我没有做什么、缺少什么或我做错了什么导致返回值为空?

4

5 回答 5

2

init方法需要调用一些[super init],所以你需要做这样的事情:

- (id)init
{
    self = [super init];
    if (self) {
        labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
    }
    return self;    
}

编辑:查看您的 git repo,我发现

controller = [[ZZController alloc] init: model: view];

我不完全确定编译器如何解释空参数,但我的猜测是它将它们读取为 nil,因此您的 ZZController 没有模型

此外,您有一些杂乱的参数顺序,第一个参数(带有 text init:)是您的模型,您的第二个参数(带有 text model:)是您的视图(这根据您的- (id)init: (ZZModel*)Model: (ZZView*)View

为了让它快速工作,你应该做

controller = [[ZZController alloc] init:model model:view];

我将在这里进行一个(短)飞跃,并猜测您是 iOS 开发的新手,因此我建议您阅读有关 objc 编程、如何编写函数、如何发送多个参数等内容,以及之后,进行一些重构

干杯!

于 2012-12-26T12:07:07.927 回答
0

建模的 init 方法从未被调用,它只是被分配的。因此,NSArarray 标签不存在,因为它是在 init 方法中创建的。

于 2012-12-27T05:14:04.367 回答
0

我建议您在 init 和 getLabels 方法中都设置一个断点,并检查存储数组的实例变量的值:您会看到哪个方法的行为与预期不同。

于 2012-12-26T12:05:06.287 回答
0

假设你没有使用 ARC 也没有合成变量标签,你需要保留数组,

- (id)init:
{
 labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];

 [labels retain];

 return self;    
}

另外,在不使用数组时需要释放它,以防止内存泄漏。

于 2012-12-26T12:05:31.217 回答
0

你可以这样做,希望在 .h 中你有NSMutableArray *labels;

- (id)init{
    if (self = [super init]) {
        labels = [[NSMutableArray alloc] initWithObjects:@"Red", @"Green", @"Blue", nil];
    }
    return self;    
}
于 2012-12-26T12:16:00.097 回答