2012-04-13 20 views
8
için C işaretçisi ekle

Düşük düzeyli görüntü belleği ile ilgilenen bir Objective-C programı yazıyorum. Veri depolamam için ANSI-C yapıları kullanıyorum - Tam üflemeli nesneler, sakladığım veriler% 100 veri olduğundan ve bu veriler üzerinde işlem yapmanın bir yöntemi olmadığından daha fazla görünmektedir. Özellikle, bir dizi renkten yararlanan özelleştirilebilir bir posterizasyon algoritması yazıyorum - işlerin zorlaştığı yer burası. Renklerimi üç şamandıranın yapıları olarak ve tamsayı bayrağı olarak (özellikle posterleştirme algoritmasıyla ilişkili olarak) saklıyorum. Everyhting ... bir şey hariç, iyi gidiyorNSMutableArray

[Gerçek bir soru]

Ben bir NSMutableArray işaretçileri nasıl ekleneceğini bilemiyorum! Bir nesneyi nasıl ekleyeceğimi biliyorum, ancak bir göstericiye işaretçi eklemek daha zor görünüyor - NSMutableArray'ın işaretçimi kaldırmasını ve yapıyı bir çeşit tuhaf nesne olarak ele almasını istemiyorum. NSMutableArray'ın işaretçiyi kendi koleksiyonuna eklemesini istiyorum. Bunu yapmayı nasıl yaparım? peşin

sayesinde

G

cevap

15

bunun için kusursuz biçimde tasarlanmış bir sınıf vardır: NSPointerArray. Apple'ın dokümanları here'a bakın. Rasgele işaretçiler için muhtemelen NSPointerFunctionsOpaqueMemory ve NSPointerFunctionsOpaquePersonality seçeneklerini kullanmak isteyeceksiniz. NSPointerArray mevcut değilse (iOS için gelişmekte eğer örneğin)

, o zaman çok yavaş kanıtlamaz & unwrapping sarılması yükü sürece, -[NSValue valueWithPointer:] kullanarak işaretçileri sarabilirdiniz.

+0

Aman! Asla düşünmezdim! Bir göz atacağım, teşekkür ederim :) –

+2

Kakao, çoğu insanın kaçırdığı birçok koleksiyon sınıfına sahiptir - NSMapTable'ı özellikle faydalı buluyorum. Tam listeye buradan ulaşabilirsiniz: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

Oh! Teşekkür ederim! Bir süredir bunu çözmek zorundayım - Bir şey, derleyicinin NSPointerArray'ı bir tür olarak tanımasıyla ilgili sorunlarım var - Tanıma için hangi başlık dosyasını almam gerektiğini biliyor musunuz? –

4

İşaretçilerinizi NSValue nesnelerine sarabilirsiniz. bunlar korunur değil -

NSMutableArray * NewNonRetainingArray() { 
    CFAllocatorRef allocator = 0; /* << default */ 
    CFIndex capacity = 0; /* << no maximum */ 

    /* 
    0 for the callbacks will result in elements which are not reference counted. 
    you can write your own callbacks, if you like some extra diagnostics or 
    special behavior. see the CFArrayCallBacks structure for a full description 
    of all callbacks. 
    */ 
    const CFArrayCallBacks* const callbacks = 0; 
    return (NSMutableArray*)CFArrayCreateMutable(allocator, capacity, callbacks); 
} 

Ancak, içeride NSObject s şeyler istemeyeceksiniz:

+0

İlginç! Teşekkür ederim :) –

1

bir NSMutableArray gerçekten ne istediğinizi ise, bu yaklaşımı kullanabilirsiniz.

Bu yaklaşımı kullanarak, CF/NS-Array öğelerinizin öğeleri, işaretçi veya boyutu bir işaretçiye eşit olan herhangi bir ilkel değer olabilir.

3

örnek:

int aa=99; 
int *a=&aa; 
char bb='a'; 
NSMutableArray *MS=[NSMutableArray new]; 
[MS addObject:[NSValue valueWithPointer:a]]; 
[MS addObject:[NSValue valueWithPointer:&bb]]; 
int *c=[[MS objectAtIndex:0] pointerValue]; 
char *d=[[MS objectAtIndex:1] pointerValue]; 
İlgili konular