2013-08-07 20 views
0

我創建C數組這樣的:我正確地創建並傳遞這個C數組到Objective-C方法並引用它的屬性?

unsigned char colorComps[] = {2, 3, 22, 55, 9, 1}; 

我想傳遞給一個Objective-C的對象的初始值設定。

所以我覺得我必須把陣列上的堆:

size_t arrayByteSize = numColorCompVals * sizeof(unsigned char); 
unsigned char *colorCompsHeap = (unsigned char*)malloc(arrayByteSize); 

然後,我有我的第一個「堆棧存儲器陣列」寫入堆陣列中的for循環:

for (int i = 0; i < numColorCompVals; i++) { 
    colorCompsHeap[i] = colorComps[i]; 
} 

旁邊的問題:是否有一個更優雅的解決方案來避免for循環步驟?

然後我將它傳遞給方法:

定義爲

- (id)initWithColorCompsC:(unsigned char *)colorCompsHeap; 

TheObject *obj = [[TheObject alloc] initWithColorCompsC:colorCompsHeap]; 

TheObject有一個屬性保持C-數組:

@property (nonatomic, assign) unsigned char *colorComps; 

而在-dealloc我免費它:

free(_colorComps); 

這是理論上的。我爲Objective-C使用ARC。 我是否正確或有更好的方法?

+0

你可能會更好地分配和拷貝構造函數中的陣列。 – Kevin

回答

1

如果TheObject將釋放陣列,然後它的init方法應該是製作副本的方法,而不是調用方。這樣每個TheObject的實例都做出自己的副本並釋放自己的副本,它擁有即複製。

此外,init的參數來自堆棧或堆的位置並不重要。如果init方法複製它,則無關緊要。

使用memcpy,使複印件,與sizeof目標數組,喜歡本作的.m文件:

@interface PTTEST() 
@property (nonatomic, assign) unsigned char *colorComps; 
@end 

@implementation PTTEST 

- (void)dealloc 
{ 
    free(_colorComps); 
} 

- (id)initWithColorCompsC:(unsigned char *)colorComps 
     numberOfColorComps:(unsigned)numberOfColorComps 
{ 
    self = [super init]; 
    if (self) { 
     // compute size based on sizeof the first element (in case 
     // the element type get changed later, this still works right) 
     size_t arraySize = sizeof(colorComps[0]) * numberOfColorComps; 

     _colorComps = malloc(arraySize); 

     memcpy(_colorComps, colorComps, arraySize); 
    } 
    return self; 
} 

@end 
+0

還有一個問題:爲什麼不size_t arraySize = sizeof(colorComps)工作? –

+1

@ProudMember因爲它返回指針的大小, –

+0

sizeof(&colorComps)? –

2

然而,這似乎罰款,...

  1. Don't cast the return value of malloc();
  2. 並且不要改造memcpy()。而不是你的循環,寫memcpy(dest, src, size)
+0

更好 - 對C99複合文字數組使用'memcpy'。更多的consise。 –

+0

@ RichardJ.RossIII是的,[我意識到他們](http://stackoverflow.com/questions/17896743/initialization-of-structure-with-ternary-operator/17896781#17896781)(我只是沒想到這是這裏的問題。) – 2013-08-07 14:06:24

+0

Richard你能解釋一下C99複合文字數組的含義嗎? –

0

似乎並不正確我,你都盡顯colorCompsHeap(無符號字符數組)與colorComps[]值(double數組)

unsigned char u = 0.2; 

printf("%f\n", (double)u); 

輸出0.000000

+1

修正後編輯問題。 –

+0

@DavidRF你是否贊成我的回答? – 2013-08-07 14:34:53

+1

沒有H2CO3,我從來沒有downvote –

相關問題