【问题标题】:How to get an NSArray that is returned from a getter method?如何获取从 getter 方法返回的 NSArray?
【发布时间】:2012-12-26 12:01:21
【问题描述】:

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

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

条件

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

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

问题

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

【问题讨论】:

  • 你是如何实例化你的类的?那里有一个 init: 方法让我很困扰,因为它没有参数,所以你发布的内容不会构建
  • 尝试 self.labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
  • 为什么不使用 NSMutableArray,而不是 NSArray
  • @Ismael,我是静态声明的,所以不需要发送初始化参数。我知道的?
  • 我的意思是显示一些代码,错误很可能在那里

标签: objective-c


【解决方案1】:

init 方法需要调用一些 [super init],因此您需要执行以下操作:

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

编辑:查看您的 git 存储库,我发现

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 编程、如何编写函数、如何发送多个参数等内容第四,然后,做一些重构

干杯!

【讨论】:

  • 我认为这只是子类化所必需的,我认为 self 总是作为第一个参数被发送而不被观察。
  • 我将上述约定添加到我的 init 方法中,但没有解决这个问题。 NSArray 仍然为空。
  • 你是如何创建这个类的,你是如何调用 getLabels 的?显示如何从外部处理它的代码,我很确定问题出在对象初始化而不是数组中。
  • 我的 git repo,查看模型、控制器、视图和主文件。 github.com/cxx6xxc/Skeleton/commits/master
  • 在controller.m中可以清楚的看到model和view都通过了。关于上面的空论点,没有遗漏的论点。它们不是“空参数”,它们是真正属于函数的空标签。
【解决方案2】:

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

【讨论】:

  • 我买不起 XCode。 Linux 机器不是免费的。
【解决方案3】:

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

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

 [labels retain];

 return self;    
}

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

【讨论】:

  • 我没有声明自动释放。不过,我可以试试。
  • 保留:没有效果。仍然为空。
  • arrayWithObjects 返回一个带有自动释放的数组。你能告诉我们更多的代码吗?您可能已分配给另一个变量。
【解决方案4】:

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

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

【讨论】:

  • 我已经正确地实现了,正如你所提到的。尝试了上述方法,但仍然:2012-12-26 06:33:38.291 executable[13300] labels: (null)
  • 尝试 if(labels) nslog(@"allocated") else nslog(@"not alloced");
  • 我在 init: 中试过这个,但 NSLog 似乎在那里不起作用。我试过(使用你的 alloc 建议),但仍然返回未分配。所有代码:github.com/cxx6xxc/Skeleton
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2013-11-16
    相关资源
    最近更新 更多