【问题标题】:NSMutable Array and brain damageNSMutable Array 和脑损伤
【发布时间】:2010-10-29 15:31:53
【问题描述】:

由于我对 obj c 和 NSMutable 数组的完全误解,我最近提出了一些愚蠢的问题,这是可以理解的。因此,我查看了我拥有的一本书和谷歌,似乎我不应该编程,因为我仍然被卡住了。

假设我正在循环通过方法 A,并且每个循环都想将一个 double 添加到 NSMutable 数组中。这是我目前发现的。

你不能把原语放在数组中,所以我把我的 double 变成了一个 NSNumber 对象

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

XCode 警告:“NSNumber”可能不会响应“+initWithDouble:”

当我编译它时:

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“+[NSNumber initWithDouble:]: unrecognized selector sent to class 0x1ffea0”

我忽略了这一点并继续前进。有人告诉我我需要一个数组的 init 方法,这是有道理的,因为我不希望在循环中发生这种情况。这是我的初始化方法:

-(id) init{
    [super init];
    arrayOfTouches = [[NSMutableArray alloc] init];
    return self;
}

我还没有尝试将它添加到数组中。

[arrayOfTouches addObject:newObject];

这能打印出数组吗?

NSLog(@"array: %@", touchBeginObj);

可能是愚蠢的问题。但是该死的,如果我能找到任何关于你能做什么和不能做什么的所有片段的好例子。

感谢任何帮助或自作聪明 cmets。

是的,我有一本 Obj-C 书,实际上是 3 本书,是的,我正在阅读它们 :)

周末愉快。

【问题讨论】:

  • IIRC,Hillegas 的书有一个关于 NSMutable 数组的部分(我记得是因为我上周自己也在学习它们)

标签: iphone objective-c nsmutablearray


【解决方案1】:
NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

您在上面的代码中缺少+alloc 调用,这就是它抛出该错误的原因——但为什么不直接使用:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];

它是自动发布的,所以你不必担心以后发布它。

我不确定其他任何一个问题都在问什么,你能改写一下吗?根据您提供的代码,我认为它应该可以工作

【讨论】:

    【解决方案2】:

    第一:

    [NSNumber numberWithDouble: double]
    

    而不是

    [NSNumber initWithDouble: double]
    

    您的 addObject 看起来不错。

    您有几种打印数组的方法,我建议您进行迭代,因为它稍后会很有用:

    for (NSNumber *number in arrayOfTouches)
    {
        NSLog(@"Number %f", [number doubleValue]);
    }
    

    【讨论】:

      【解决方案3】:

      initWithDouble 是一个实例方法,你正在寻找类方法numberWithDouble

      【讨论】:

      • 先生。约翰·富兰克林,当我的号码打印在控制台上时,我感到如释重负。 numberWithDouble。啊啊啊啊,谢谢!
      • NSLog(@"array: %@", arrayOfTouches);仍然打印出数组:(null)
      • 您是否在某处将arrayOfTouches 设置为零?你确定你正在初始化arrayOfTouches吗? nil 可以传递任何消息,并且会悄悄地忽略它。所以NSMutableArray *foo = nil; [foo addObject:bar]; 将编译并运行,但显然bar 从未真正保存过。放置几个断点,一个在init 方法中(确保它被调用),一个在NSLog 行,看看它是否在init 之前被调用。
      【解决方案4】:

      改变这个:

      NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];
      

      到这里:

      NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];
      

      -initWithDoubleNSNumber 的实例方法(因此您需要先执行[NSNumber alloc])。 +numberWithDouble 是一个类方法。

      【讨论】:

        【解决方案5】:

        您需要从编译器获得零警告 - 您不能忽略它们并“继续”。 您正在努力学习基础知识,您有其他编程语言的经验吗?

        要使用 Objective-c 进行编码,您必须了解一些事项,并且您必须熟悉面向对象编程的一般概念。一点 C 也很有帮助,因为 Objective-c 是 C 的扩展,它可以提供一些关于为什么面向对象如此有用和值得努力的观点。

        如果您已经了解 Python、Java 甚至 Actionscript 之类的语言,那么几乎所有的概念都是相同的,而且 Objective-c 真的没有那么难。你只需要这些概念如何转化为objective-c的细节。例如,

        你如何定义一个类?你如何覆盖现有的类?初始化方法是什么样的?你如何创建一个类的实例?等等。还有一些比这更多的东西,但实际上并不多 - 你需要学习它们,或者至少在开始时手头有参考资料,这样你就不会出错。如果您不知道它们的含义,那么您需要了解它们。

        “类”就像一块内存布局的蓝图,在 NSNumber 的情况下,我们希望一块内存能容纳一个数字。 NSNumber 类知道内存必须有多大以及应该如何布局。我们真的很少关心蓝图,类 - 我们想要一个可以保存数字的实际内存块 - 类的实例

        在objective-c中创建一个给定类的对象、实例总是、每次、总是、总是涉及——首先——声明拥有正确大小的空闲内存块的所有权,并保存该块的地址将内存分配给变量,然后让对象有机会通过调用它的首选设置方法来进行自己的初始设置。

        要声明对内存的所有权,请将 alloc 方法发送给类。

        NSNumber *myNumberVariable = [NSNumber alloc];
        

        要将数字设置为初始值 10.0,请将消息 initWithDouble: 发送到新实例。

        [myNumberVariable initWithDouble:10.0];
        

        为方便起见,这些可以并且通常组合成一个语句。

        NSNumber *myNumberVariable = [[NSNumber alloc] initWithDouble:10.0];
        

        这是 Objective-C 编程最基本的方面。如果不彻底了解这一点,您将无法做任何事情。谷歌搜索 init objective-c 会返回数百个教程、指南、备忘单和帮助。

        如果您自己的类需要在创建实例时初始化属性,例如您的 arrayOfTouches,您必须覆盖父类的首选设置方法。如果父类是 NSObject,则 NSObject 的首选设置方法是 init。如果你在你的 setup 方法中创建一个对象,你必须总是有一个 dealloc 方法。这将永远、永远、永远是这样的:

        - (id)init {
          self = [super init];
          if(self){
        
          }
          return self;
        }
        - (void)dealloc {
          [super dealloc];
        }
        

        只有名称“init”会改变,取决于您要覆盖的方法的名称,- (id)init 变为 - (id)nameOfMethodIAmOverriding 和 [super init] 变为 [super nameOfMethodIAmOverriding];

        有了这个用于设置和拆卸的标准模板,您可以添加自己的属性的设置和拆卸。在你的情况下给你。

        - (id)init {
          self = [super init];
          if(self){
            arrayOfTouches = [[NSMutableArray alloc] init];
          }
          return self;
        }
        - (void)dealloc {
          [arrayOfTouches release];
          [super dealloc];
        }
        

        看,我并不是认为你有愚蠢的问题,它们是明智的问题,但如果你有 3 本书 - 答案几乎肯定在每本书的前几页 - 也许你正在学习这个错误。不知何故,你没有得到基本面。我能建议的最好的方法是放慢速度并做书中的练习,或者选择一种更简单的语言并在转向 Objective-c 之前尝试掌握它。

        【讨论】:

        • 谢谢!!我只有 PHP 方面的经验,并且只以程序方式使用它。我非常感谢您花时间对此回复。再次感谢!
        【解决方案6】:

        转到帮助-->开发人员文档

        搜索 NSNumber。在类方法下,您将了解如何使用双精度创建 NSNumber。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          相关资源
          最近更新 更多