2011-05-17 183 views
1

我有一个“Note”类,并且我有一个Tuner类。我的Tuner类正在初始化一个NSArray*它的init函数。iOS对象数组:在一个函数内部创建一个对象数组

我想初始化这个数组来保存88个音符,现在我正在创建诸如Note * key1;等等

我只是确保我需要为这些笔记分配一些东西,以便在初始化完成后它们不会超出范围,并且我的NSArray会保留其条目的完整性,或者我能够声明Note key1并将其插入到数组中,并为我照顾。 创建NSArray包含少数几个对象的示例代码片段,即使在函数退出后该数组仍然存在将非常有帮助。谢谢!

回答

2

NSArrayNSMutableArray发送-retain对象加入时,他们,所以适当的事情做的是-release你添加的对象明确,或使用自动释放的对象。

这里是为Tuner类的-init方法,一个简单的例子:

- (id)init 
{ 
    NSInteger i; 
    Note   *note; 

    self = [ super init ]; 
    if (self) { 
     notes = [[ NSMutableArray alloc ] initWithCapacity: 88 ]; 
     for (i = 0; i < 88; i++) { 
      note = [[ Note alloc ] initWithKey: i ]; 
      [ notes addObject: note ]; 
      [ note release ]; 
     } 
    } 

    return(self); 
} 

您需要+alloc每一个音符对象和-release它,因为它保留其添加到阵列。为了消灭当你完成所有提示对象,请确保您的Tuner类释放阵列中的-dealloc方法:

- (void)dealloc 
{ 
    [ notes release ]; // this sends release to all objects in the array, too 

    [ super dealloc ]; 
} 
+0

谢谢,与NSMutableArray或只是标准的NSArrays我需要在数组的末尾添加零?我在某处读过这些内容,但不确定何时该做这件事。 – hrtachetosing 2011-05-17 15:25:28

+0

'nil'被称为哨点值。它告诉接收者变量长度变量列表的末尾在哪里。你只需要使用特定的'NSArray'(及其子类)和'NSDictionary'方法,如'-initWithObjects:',例如:'array = [[NSArray alloc] initWithObjects:a,b,c,nil];' 。由于'-initWithObjects:'接受任意数量的参数,因此需要通过某种方式告知接收方哪个参数是最后一个参数。 'nil'就是为了这个目的。 – 2011-05-17 15:42:51

+0

只是为了澄清:'-addObject:'不需要定位零值,因为您只需添加一个对象。 – 2011-05-17 15:45:32

0

嗯,我不完全确定你在做什么,但是你可以把一个NSMutableArray作为一个全局变量。然后你可以添加和删除任何类型的任何对象到这个数组中。该数组仍然会在内存中,直到您将其称为释放方法。

2

这里有一个如何做,在你的Tuner

for (int i = 0; i < 88; ++i) 
{ 
    Note *key = [[Note alloc] init]; 
    [myNotes addObject:key]; 
    [key release]; 
} 

的初始化函数一个简单的例子,请注意,在我的例子,myNotes被假定为类型NSMutableArray的这是唯一的出路你可以通过像这样分别添加对象来构建一个数组。

+1

你可以在本例中使用'initWithCapacity:'实例化你的myNotes NSMutableArray,因为你知道它是最终的容量。这会阻止阵列在添加对象时调整大小,这会给你一个(可能忽略不计)的性能提升。 – 2011-08-30 00:55:50

1

将举行音符数组类里面。

  1. 使用称为笔记的NSMutableArray类型(非原子,保留)创建属性。
  2. 合成它。
  3. 确保它在dealloc方法中发布。

内用于创建阵列的方法,包括:

  1. init和的alloc一个新的临时的NSMutableArray。
  2. 循环并将所有Note对象添加到数组中。
  3. 将此数组添加到笔记。