2010-04-27 44 views
1

我有一个类中定义的,像这样的属性:如何@synthesize指针的C风格数组?

@interface myClass 

UIImageView *drawImage[4]; 
... 
@property (nonatomic, retain) UIImageView **drawImage; 
... 
@synthesize drawImage; // This fails to compile 

我发现在计算器上和其他地方,真正解决这个问题类似的问题,但没有。什么是最Objective-C的犹太教方式来做到这一点?

回答

4

你不能;您必须将retain更改为assign并自行处理内存管理;因为你不能发送-[retain]UIImageView **(因为它不是一个对象)。

也就是说,你实际上不能使用@synthesize,因为这会导致史诗内存泄漏assign,并且不能与retaincopy一起使用;你需要做的是实现-drawImage-setDrawImage:并编写一些实际的访问者代码。

但不这样做。使用NSArray

+0

我将使用NSArray,它会让事情变得更轻松。感谢你的回答! – 2010-04-27 22:25:25

+0

有些时候您需要使用C风格的阵列,那就是性能至关重要。 NSArray比C风格数组慢6-7倍:http://memo.tv/nsarray_vs_c_array_performance_comparison_part_ii_makeobjectsperformselector – pixelfreak 2011-08-29 22:38:07

+0

@pixelfreak:首先;在执行某些操作时,NSArray比C风格的数组*要慢;这是一个重要的区别。其次,如果性能至关重要,那么您可能会使用OpenGL进行绘图。 – 2011-08-30 12:18:16

1

最“犹太教”的方式是创建一个UIImageView对象的NSArray,而不是一个C风格的数组。

+0

好点的,不涉及寿的问题“偶尔你需要C数组(通常并不是图像视图,寿”)。 – 2010-04-27 20:43:30

1

您将遇到的一个问题是函数无法返回C或Objective-C中的C风格的数组,您可能会遇到的另一个问题是您无法将指针类型分配给数组类型是你合成的setter可能试图做的)。至少有两种解决方案:

  1. 使用NSArray而不是C风格的数组。这是最干净的路线,尤其是因为您只需管理一个对象的内存而不是四个。
  2. 将C型阵列包装成struct。你不能直接从函数返回C风格的数组,但是你可以返回一个有阵列成员的struct(注意没有retain/release继续)。
    typedef struct { 
        UIImage *image[4]; 
    } ImageCollection; 
    ... 
    @property (nonatomic, assign) ImageCollection drawImage; 
    ... 
    @synthesize drawImage;