我在做OpenGL的一个小测试程序时碰到需要定义数组的情况,然后就在一个objc类中定义了一个数组,不过后面问题来了,我该如何为它声明property呢?请见下列示例代码:

//test.h
@interface MyTest : NSObject{
        int myArray[5];
}
@end

如果采用

 
@property int myArray[5];

肯定会出错。
因为@property的声明指示编译器默认地给myArray添加了myArray以及setMyArray的这样一对getter和setter方法。由于objective-C中方法的返回类型不能是数组,所以上述声明property的方式是通不过编译的。
正确的方式是:

 

//test.h
@interface MyTest : NSObject {
        int myArray[5];
}
- (void)outPutValues;
@property int* myArray;
@end

即,使用指针来表示返回类型并作为参数设置类型。
不过这样一来就无法在.m文件的实现中使用@synthesize,而是需要显式地实现这对方法:

#import <Foundation/Foundation.h>
#import "test.h"
#include <stdio.h>
 
@implementation MyTest
 
- (int*)myArray
{
        return myArray;
}
 
- (void)setMyArray:(int*)anArray
{
        if(anArray != NULL)
        {
                for(int i=0; i<5; i++)
                        myArray[i] = anArray[i];
        }
}
 
- (void)outPutValues
{
        int a[5];
        for(int i=0; i<5; i++)
                printf("%d    ", (myArray)[i]);
}
 
@end
 
 
int main (int argc, const char * argv[]) 
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        // insert code here...
        int a[] = { [4] = 100 };
        MyTest *myTest = [[MyTest alloc] init];
 
        [myTest setMyArray:a];
        NSLog(@"The fifth value is: %d", [myTest myArray][4]);
        [myTest outPutValues];
 
        [myTest release];
        [pool drain];
        return 0;
}

这样一来对于数组型变量成员就无法使用点(.)操作符来抽象掉对setter和getter的调用(使用点操作符访问对象的成员数据非常方便,根据索要访问的数据成员处于左值还是右值而由编译器自动判定调用setter还是getter)。

另外,setMyArray的参数类型可以是const:

- (void)setMyArray:(const int*)anArray


我们想把c的数组作为objc的属性,又不想使用NSArray,该如何解决?

例如:

 

int d[3] = {1,2,3};

 

 

NSString *st[3] ={@"111",@"222",@"333"};

 

这样的c数组?

下面利用c数组与指针相互转化的特性来解决这个问题,指针是可以作为objc的属性的

 

基本代码如下:

 

 

#import <Foundation/Foundation.h>

 

@interface Objtest : NSObject {

 

int *d;

NSString **st;

 

}

@property int *d;

@property (nonatomic,assign) NSString **st;

 

@end

#import "Objtest.h"

 

 

@implementation Objtest

@synthesize d,st;

 

-(void)dealloc{

free(st);

free(d);

[super dealloc];

}

 

-(id)init{

self = [super init];

if (self) {

 

self.st = (NSString **)malloc(sizeof(NSString*)*3);

st[0] = @"1111";

st[1] = @"2222";

st[2] = @"3333";

 

self.d = (int *)malloc(sizeof(int)*3);

d[0] = 1;

d[1] = 2;

d[2] = 3;

}

return self;

}

 

@end

 

使用的时候象下面这样就可以了,可以直接用dot语法来访问

 

 

Objtest *obj = [[Objtest allocinit];

 

for (int i = 0; i<3; i++) {

 

NSLog(@"string[%d] == %@",i,*obj.st);

obj.st++;

 

NSLog(@"int[%d] == %d",i,*obj.d);

obj.d++;

}

 

原文地址:http://www.cocoachina.com/bbs/read.php?tid-8008.html