1

我想知道是否有任何用于objective-C 的示例代码来实现结构类型的NSMutableArray。在内部,我需要在结构中声明 2 个可变数组(也通过 NSMutableArray)。我书中的所有代码示例都向我展示了如何通过 C 数组语法(使用括号)创建一个定义大小的数组,但我不知道如何使用 NSMutableArray。以前有没有其他人这样做过?到目前为止,这是我的代码......它编译得很好我已经定义了数组的大小(下面的代码中使用了 2 和 5 作为示例,但我需要设置它以便让它们可变。我可以使用简单的结构,当它们只有一些“更易于理解”的数据类型,如 int、double、short、long、BOOL(你明白了)。当它进入指针时,这就是我迷路的地方(我可以很好地使用指针,但是知道如何将它们放入结构中是困难的部分)。一旦代码与 NSMutableArray 一起工作,我会将“network”作为指向“Network”类型的指针放在接口中吗?我以前试过这个,但我得到了错误。最后,我基本上希望能够写

network.input[2].list[1].value = 5.0;

在任意定义的“网络”类型数组上。任何人都可以提供有关制作“Network”类型的 NSMutableArray 的信息的建议或链接,其中包括两个 NSMutableArray 的结构?谢谢你的帮助!

一些文件.h

#import <Foundation/Foundation.h>

struct lists{
    double value;
};

// supporting structs
struct inputs{
    struct lists list[2];
};

struct Network {
    struct inputs input[5];
    struct lists output[5];
}

@interface SomeFile : NSObject {

}

@end

一些文件.m

#import "SomeFile.h"
@implementation SomeFile
@end
4

2 回答 2

2

NSArray 和 NSMutableArray 只能包含 Objective-C 对象,因此不能在其中存储结构。如果内容必须是结构并且您想要类似于 NSArray 的内容,请使用NSPointerArray,在 10.5 及更高版本中可用。

您可以像任何其他指针类型一样在结构中存储指向 Objective-C 对象(如NSPointerArray*或)的指针。id例如,您可以为双向链表节点声明一个结构,该结构存储一个 Objective-C 对象,如下所示:

typedef struct DoublyLinkedListNode {
    id object;
    __strong struct DoublyLinkedListNode *next;
    __strong struct DoublyLinkedListNode *prev;
} DoublyLinkedListNode;

__strong属性与 Objective-C 2.0 中的垃圾收集一起使用,因为指向 Objective-C 对象的指针充当强引用,但 C 指针类型默认情况下不这样做。这样,只要列表中的一个节点被 __strong 引用引用,列表就不会消失。(阅读垃圾收集编程指南了解详细信息,尤其是使用核心基础和垃圾收集的后半部分。)您可能需要考虑为您的结构执行此操作。

至于您想要的语法,我可能还没有完全理解您的问题,但是您将无法使用括号语法来访问 Cocoa 集合中的对象,例如 NSPointerArray。(此外,您可能必须对结构使用“ ->”运算符而不是“ .”,因为它们很可能是在堆上分配的。所有 Objective-C 对象都必须是,我假设你会想要将这些结构存储在方法的本地范围之外。)

由于 Objective-C 没有泛型,你也不能“实现 [an] NSMutableArray of type struct”。实际上,您之前的一个 SO 问题对此主题有更多详细信息。如果这不是你的意思,请随时澄清。

于 2009-07-16T07:37:00.430 回答
1

这不是一个完整的答案;我不确定您不知道如何将指针放入结构中是什么意思。我将继续假设您要对具有动态数量的多个输入和输出的网络进行建模。

您在这里有几个选择:

  1. 使用值对象而不是结构来存储您的值:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. 使用对象为您的网络建模:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. 就像你已经在做的那样使用结构;如果您需要预先更改大小,请使用您的朋友 malloc:

    struct Network_value {
      double value;
    }
    
    struct Network {
        struct Network_value **inputs;
        struct Network_value *outputs;
    };
    
    void Network_alloc(Network *n, unsigned inputs, unsigned input_values, unsigned outputs) {
        n->outputs = calloc(sizeof(Network_value), outputs);
        n->inputs = calloc(sizeof(Network_value *), inputs);
        while (inputs --> 0) {
            n->inputs[inputs] = calloc(sizeof(Network_value), input_values);
        }
    }
    
    void Network_free(Network *n, unsigned inputs) {
        free(n->outputs);
        while (inputs --> 0) {
            free(n->inputs[inputs]);
        }
        free(n->inputs);
    }
    
    Network network;
    Network_alloc(&network, 5, 2, 5);
    
    network.inputs[2][1].value = 5.0;
    
    Network_free(&network, 2);
    
  4. 通过呈现一个 Network 对象来结合想法 2 和 3,但在内部使用结构存储值。如果输入和输出的数量非常大,这可能是一个好主意。

于 2009-07-16T13:41:27.110 回答