代码之家  ›  专栏  ›  技术社区  ›  Josh Bradley

如何编写一个结构类型的NSMutableArray,其中也包含NSMutableArray?

  •  1
  • Josh Bradley  · 技术社区  · 17 年前

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

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

    #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
    

    #import "SomeFile.h"
    @implementation SomeFile
    @end
    
    2 回复  |  直到 17 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    NSPointerArray

    你可以存储指向Objective-C对象的指针(比如 NSPointerArray* 或 id

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

    这 __strong Garbage Collection Programming Guide

    -> “操作员代替” . “对于结构体,因为它们很可能被分配在堆上。所有Objective-C对象都必须被分配,我假设你想将这些结构体存储在方法的本地范围之外。”

    one of your previous SO questions 有关于这个主题的更多细节。如果这不是你的意思,请随时澄清。

        2
  •  1
  •   Ben Stiglitz    17 年前

    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. 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);