2010-04-27 18 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;