NSMutableArray和脑损伤

时间:2010-10-29 15:31:53

标签: iphone objective-c nsmutablearray

由于我对obj c和NSMutable数组的完全误解,我最近得到的一些骨头问题吸引了一些自作聪明答案。所以我看了一本书和谷歌,看起来我可能不应该编程,因为我还是卡住了。

假设我循环遍历方法A并且每个循环通过我想在NSMutable数组中添加一个double。这是我到目前为止所发现的。

你不能将基元放在数组中,所以我将我的双重转换为NSNumber对象

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

XCode警告:'NSNumber'可能无法响应'+ initWithDouble:'

当我编译它时得到:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [NSNumber initWithDouble:]:无法识别的选择器发送到类0x1ffea0'

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

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

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

[arrayOfTouches addObject:newObject];

这是否可以打印出阵列。

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

可能是Bonehead的问题。但该死的,如果我能找到任何关于你能做什么和不能用一个好榜样的所有部分。

感谢您提供任何帮助或智能评论。

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

祝周末愉快。

6 个答案:

答案 0 :(得分:10)

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

您错过了上述代码中的+alloc调用,这就是为什么它会抛出该错误 - 但为什么不使用:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];

它是自动释放的,所以你不必担心以后会释放它。

我不确定其他任何一个问题是什么,你能否改写一下?从您提供的代码中,我认为它应该起作用

答案 1 :(得分:5)

第一:

[NSNumber numberWithDouble: double]

而不是

[NSNumber initWithDouble: double]

你的addObject看起来很好。

你有几种打印阵列的方法,我建议迭代,因为它稍后会有用:

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

答案 2 :(得分:3)

改变这个:

NSNumber *newObject = [NSNumber initWithDouble:doubleNumber];

到此:

NSNumber *newObject = [NSNumber numberWithDouble:doubleNumber];

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

你需要从编译器得到零警告 - 你不能忽略它们并'伪造'。 您正在努力学习基础知识,您是否有其他编程语言的经验?

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

如果你已经知道像Python,Java甚至Actionscript这样的语言,那么几乎所有的概念都是相同的,而且客观的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 和< strong> [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之前尝试掌握它。

答案 5 :(得分:1)

转到帮助 - &gt;开发人员文档

搜索NSNumber。在类方法下,您将找到如何使用double创建NSNumber。