Objective c 修改Obj-C中的数组(由getter返回,例如int**)

Objective c 修改Obj-C中的数组(由getter返回,例如int**),objective-c,arrays,getter,Objective C,Arrays,Getter,假设有一个类: @interface FooBar : NSObject @property(readonly, getter = _getSpace) int** space; @end 空间属性的实现方式如下所示: @implementation FooBar int m_space1[256]; int m_space2[256]; int* m_space[2] = { m_space1, m_space2}; -(int **) _getSpace { return

假设有一个类:

@interface FooBar : NSObject

@property(readonly, getter = _getSpace) int** space;

@end
空间属性的实现方式如下所示:

@implementation FooBar

int m_space1[256];
int m_space2[256];
int* m_space[2] = { m_space1, m_space2};

-(int **) _getSpace {
    return m_space;
}

@end
使用以下命令更改int[2][256]数组是否合法:

FooBar * f = [[FooBar alloc] init];
f.space[1][120] = 0;

是的。您将返回一个指针,然后修改所指向的值。这是完全合法的。如果不想允许这样做,则需要向类型添加适当的常量修饰符

不合法的是返回一个结构并直接修改该结构


正如KennyTM在评论中提到的,您的
m_空间{,1,2}
变量是全局变量,而不是您可能想要的实例变量。解决此问题的最简单方法是在
@实现中放置一个ivar块,如中所示

@implementation FooBar {
    int m_space1[256];
    int m_space2[256];
    int* m_space[2] = { m_space1, m_space2 };
}

-(int **) _getSpace {
    return m_space;
}
@end

对。您将返回一个指针,然后修改所指向的值。这是完全合法的。如果不想允许这样做,则需要向类型添加适当的常量修饰符

不合法的是返回一个结构并直接修改该结构


正如KennyTM在评论中提到的,您的
m_空间{,1,2}
变量是全局变量,而不是您可能想要的实例变量。解决此问题的最简单方法是在
@实现中放置一个ivar块,如中所示

@implementation FooBar {
    int m_space1[256];
    int m_space2[256];
    int* m_space[2] = { m_space1, m_space2 };
}

-(int **) _getSpace {
    return m_space;
}
@end

我还想说,虽然有效,但这是一种非典型模式。我的问题确实是由你提到的类似结构案例引发的。我还想说,虽然有效,但这是一种非典型模式。我的问题确实是由你提到的类似结构案例引发的。请注意
m_space1
m_space2
m_space
将声明为全局变量,尽管它们位于
@implementation FooBar
中?所以每个FooBar实例不会有单独的m_space*成员集?对。如果您需要实例变量,请将它们放入
@interface{…}
@Calikin:正如KennyTM所建议的那样,我已经更新了我的答案,以说明如何使它们成为IVAR。请注意,
MU space1
MU space2
MU space
将被声明为全局变量,尽管它们在
@implementation FooBar
.Global中?所以每个FooBar实例不会有单独的m_space*成员集?对。如果您需要实例变量,请将它们放入
@interface{…}
@Calikin:正如KennyTM所建议的,我已经更新了我的答案,以展示如何使它们成为IVAR。