如何获取从getter方法返回的NSArray?

时间:2012-12-26 12:01:22

标签: objective-c

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

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

条件

  1. 我在对象的NSArray方法中创建init

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

  3. 问题

    抵达后,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返回一个null对象。

    调用方法

    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;
    }
    

    问题

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

5 个答案:

答案 0 :(得分: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没有模型

另外,你有一些凌乱的参数顺序,第一个参数(文本init:)是你的模型,你的第二个参数(文本model:)是你的视图 (根据您的- (id)init: (ZZModel*)Model: (ZZView*)View

为了使其快速运作,你应该

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

我要在这里做一个(短暂的)飞跃并猜测你是iOS开发的新手,所以我建议你阅读有关objc编程,如何编写函数,如何发送多个参数等等等等等等等等等等。在此之后,进行一些重构

干杯!

答案 1 :(得分:0)

我建议你在init和getLabels方法中放置一个断点,并检查存储数组的实例变量的值:你会看到哪个方法没有按预期运行。

答案 2 :(得分:0)

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

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

 [labels retain];

 return self;    
}

此外,您需要在不使用阵列时释放它以防止内存泄漏。

答案 3 :(得分:0)

你可以这样做,希望你有NSMutableArray *labels;

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

答案 4 :(得分:0)

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