【问题标题】:How to use a two-dimensional C array of Objective-C objects?如何使用 Objective-C 对象的二维 C 数组?
【发布时间】:2009-07-13 11:05:15
【问题描述】:

我有一个 Objective-C 对象的二维 C 数组。如何访问这些对象的成员?

id array[5][5];
array[0][0] = [[Ball alloc] init];

Ball 类有两个成员:

int size;
CGPoint point;

如何访问存储在数组[0][0] 中的 Ball 对象的大小?请告诉我我该怎么做。

提前致谢!

【问题讨论】:

    标签: c objective-c arrays multidimensional-array


    【解决方案1】:

    取决于哪个运行时(32 位或 64 位)以及您是显式声明实例变量(sizepoint)还是让它们由运行时合成,您可以直接访问它们在array[0][0]->size然而,这不是一个好主意。它将在现代运行时中断,并且非常不是 Objective-C 方式,并且通过公开公开类的实现细节来破坏封装。

    在 Objective-C 2.0 中,正确的做法是为您希望公开可见的每个属性声明一个属性。将以下内容添加到Ball@interface 声明中:

    @property (assign) int size;
    @property (assign) CGPoint point;
    

    Ball@implementation 块中:

    @synthesize size;
    @synthesize point;
    

    您现在可以访问像((Ball*)array[0][0]).size 这样的大小。编译器需要转换才能将点表示法识别为属性访问。如果您使用访问器方法(由@synthesize 自动生成)则不需要:[array[0][0] size]

    【讨论】:

      【解决方案2】:

      虽然它可能与您的问题并不完全相关(也许您只是在使用一个简化的示例),但是在这种情况下为什么不使用使用结构而不是对象呢?由于 size 和 point 都是非对象,所以它可能更有意义。

      【讨论】:

        【解决方案3】:

        你可以这样做:

        @interface Moo : NSObject {
        @public
            int age;
        }
        

        然后你可以在没有警告的情况下这样做:

        Moo *m = [[Moo alloc] init];
        m->age = 16;
        Moo *arr[4];
        arr[0] = m;
        printf("Age: %d",arr[0]->age);
        

        你也可以做一些转换:

        id arr[4];
        arr[0] = m;
        printf("Age: %d",((Moo *)arr[0])->age);
        

        这应该适用于任意维数的数组! 希望这会有所帮助。

        【讨论】:

        • 在 Objective-C 中公开暴露实例变量并不是实现这一点的好方法。它使代码变得脆弱。我建议上面的 Barry 解决方案。
        • 他只问怎么做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        相关资源
        最近更新 更多