繁体   English   中英

如何使用c数组作为Objective-C对象中的实例变量?

[英]How to use c array as instance variable in an object in Objective-C?

我想在可可对象的接口块中将ac数组声明为实例变量(例如int arr [256])。 我知道@property不支持c数组,但是如何为c数组手动添加getter和setter,我应该在哪里分配和释放它?

任何输入将不胜感激。 我真的不想使用NSMutableArray访问int值。

您可以使用结构来包装数组。 这可能是允许通过赋值复制数组的一个例外。 这种方法的好处是无需显式分配或释放内存。

typedef struct
{
    int data[256];
} MyInts;


@interface MyClass : NSObject
{
    MyInts ints;
}
- (MyInts) ints;
- (void) setInts:(MyInts) someInts;
@end



@implementation MyClass

- (MyInts) ints
{
    return ints;
}

- (void) setInts:(MyInts) someInts
{
    ints = someInts;
}

@end


int main(void)
{
    MyInts ints = {{0}};
    ints.data[4] = 345;
    ints.data[5] = 123;
    ints.data[6] = 101;

    MyClass *someObj = [[MyClass alloc] init];

    [someObj setInts:ints]; // provide the ints to the object
    [someObj mutateTheInts]; // have object do something with them
    ints = [someObj ints]; // get them back

    return 0;
}

我应该在哪里分配和释放它?

好吧,您将在分配和释放它的位置上执行与任何实例变量相同的操作: initdealloc 诀窍是您必须使用mallocfree而不是retainrelease

至于属性,您可以声明它们,只需要编写自己的访问器和修改器即可。

同样,请记住,为此,C数组就像一个指针。

这么说,您可能会执行以下操作:

@interface MyClass : NSObject
{
    int *arr;
}
@property int *arr;
@end

@implementation MyClass

#import <stdlib.h>

@dynamic arr;

- (id)init
{
    if ((self = [super init])) {
        arr = malloc(sizeof(int) * 256);
    }
    return self;
}

- (void)dealloc
{
    free(arr);
    [super dealloc];
}

- (int *)arr
{
    // Return a copy -- don't want the caller to deallocate
    // our instance variable, or alter it without our knowledge!
    // Also note that this will leak unless the caller releases it.
    int *arrCpy = malloc(sizeof(int) * 256);
    memcpy(arrCpy, arr, sizeof(int) * 256);
    return arrCpy;
}

- (void)setArr:(int *)anArr
{
    if (arr != anArr) {
        free(arr);
        // Again, copy the data so that the caller can't
        // change the values of specific ints without
        // out knowledge.
        int *anArrCpy = malloc(sizeof(int) * 256);
        memcpy(anArrCpy, anArr, sizeof(int) * 256);
        arr = anArrCpy;
    }
}

您可以执行一些更好的错误检查,并且可以对代码进行些许修饰,但这就是要点。

您还可以使用CoreFoundation数据类型,这些数据类型基本上只是C原语和结构。 内存管理会容易一些,但它也不是您要求的“直C”整数。

不过,老实说,我认为您最好只使用NSNumber对象的NSArray -内存管理会容易得多 ,并且可能与其他Objective-C框架更加兼容。 由于Cocoa会将数据类型考虑到64位和32位环境以及字节顺序,因此它也将与平台无关。 至少,您可能应该使用NSInteger而不是int。

您可以声明它们,但是没有C数组的“设置器”之类的东西-您不能在C中设置它们,只能将值分配给它们的索引。 您可能有一个指针的getter和setter方法,尽管这引发了您必须回答的大量内存管理问题。

如果您只需要一个int数组,而不需要管理或将其与对象本身分开分配和释放,则只需声明:

int arr[256];

在您的@interface声明中,您的对象将具有一个实例变量,该变量可以容纳256个整数。 如果您想要数组的int元素的getter或setter方法,则必须手动声明和编写它们(在属性之前的老式方法)。

- (int)myElementOfArrAtIndex:(int)index {
  if (index >= 0 && index <= 255) {
    return (arr[index]);
  } else {
    // error handler
  }
}

等等

除非您要管理与对象分开的数组内存(例如保留数组并释放对象,反之亦然),否则无需声明指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM