【问题标题】:Objective-C. Property for C array目标-C。 C 数组的属性
【发布时间】:2013-07-07 01:42:55
【问题描述】:

我需要这样的东西:

@property (nonatomic, retain) int field[10][10];

但此代码不起作用。如何更换它?我需要 setter 和 getter 方法

【问题讨论】:

  • 另外,为什么不能简单地使用 NSArray?
  • 1)您建议转换为 NSArray 并从中转换。您还需要将 int 类型的简单变量转换为 NSValue 对象之类的东西。或者我需要重写所有以前的代码以使用 NSArray 而不是 c 数组。 2)我使用多个 c 的 int 数组,而不是一个 NSArray 的带参数的对象,因为变量足够简单,而且这些数组代表逻辑层之类的东西

标签: objective-c arrays properties instance-variables


【解决方案1】:

如果将数组包装在结构中,则可以做到这一点。 @property 表示法支持结构(例如,请参阅 CALayer 上的 CGRect 边界)。

首先定义你的结构:

typedef struct {
    int contents[10][10];
} TenByTenMatrix;

然后,在你的类界面中,你可以这样做:

@property (assign) TenByTenMatrix field;

请注意,在这种情况下,您只能使用该属性获取或设置整个数组。所以你不能这样做

self.field.contents[0][0] = 1;

你必须这样做

TenByTenMatrix temp = self.field;
temp.contents[0][0] = 1;
self.field = temp;

【讨论】:

    【解决方案2】:

    如果我理解正确,你需要这样的东西:

    @property(nonatomic, assign) int** field;
    

    请注意,您不能在此处使用retain,因为它仅可用于对象(而int 是原始类型)。

    那么你可以通过以下方式使用它:

        //some initialization - just an example, can be done in other way
    self.field = malloc(10 *  sizeof(int));
    
    for(int i = 0; i < 10; i++) {
        self.field[i] = malloc(10 * sizeof(int));
    }
    
    //actual usage
    self.field[2][7] = 42;
    int someNumber = self.field[2][7];
    

    因为属性的类型是assign,所以你必须注意内存管理。您可以为field 属性创建自定义设置器并在其中调用free()

    【讨论】:

      【解决方案3】:

      编写 setter 和 getter

      - (int) field:(int)i j:(int)j {
          return field[i][j];
      }
      
      - (void)setField:(int)i j:(int)j toValue:(int)value {
          field[i][j] = value;
      }
      

      【讨论】:

      • 我的意思是存储整个数组,而不是单独的值
      • 这行不通。 Objective-C 属性的 Setter 只接受一个参数,而 getter 不接受任何参数。
      • 我的意思是使用@property 设置和获取整个数组的两种方法。所以这个答案看起来像是正确答案的 30-50%。
      • @MichałCiuba 如果你只想要数组,你可以使用 -(int **)getField { return field; }
      【解决方案4】:

      这很简单。

          @interface MyClass
          {
              int _fields[10][10]; 
          }
      
          @property(readonly,nonatomic) int **fields;
      
          @end
      
          @implementation MyClass
      
          - (int *)fields
          {
              return _fields;
          }
      
          @end
      

      在属性中使用只读,因为它是一个固定指针,你不会改变它,这并不意味着你不能修改数组中的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 2012-03-04
        • 2013-02-25
        • 2023-03-03
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多