2011-06-02 22 views
11

ben port o NSMutableArray için düğüm yolunun nesne oluşturmak alabileceği ve örneğin okumaya nasıl bilmek gerekir bu Düğüm yapısının NSMutableArray oluşturmak için gereken buNSMutableArray yapılarını nasıl oluşturabilirim?

typedef struct Node { 
    NSString* Description; 
    NSString* AE; 
    NSString* IP; 
    NSString* Port; 
} Node; 

gibi bir yapı oluşturdu.

+0

+ 1 hepinize. –

cevap

3

Nesne-C nesnelerini yalnızca NSMutableArray'da saklayabilirsiniz. Yapabileceğiniz

Bir rota standart C dizi kullanmaktır:

unsigned int array_length = ...; 
Node** nodes = malloc(sizeof(Node *) * array_length); 

diğer bir güzergahı Objective-C nesnesi yapısını sarılmasıdır: Sonra

@interface NodeWrapper : NSObject { 
    @public 

    Node *node; 
} 
- (id) initWithNode:(Node *) n; 
@end 

@implementation NodeWrapper 

- (id) initWithNode:(Node *) n { 
    self = [super init]; 
    if(self) { 
    node = n; 
    } 
    return self; 
} 

- (void) dealloc { 
    free(node); 
    [super dealloc]; 
} 

@end 

, sen ediyorum böyle senin NSMutableArray için NodeWrapper nesneleri ekleyin:

Node *n = (Node *) malloc(sizeof(Node)); 
n->AE = @"blah"; 
NodeWrapper *nw = [[NodeWrapper alloc] initWithNode:n]; 
[myArray addObject:nw]; 
[nw release]; 

ret etmek Rieve NodeWrapper dan Node, sadece bu yapardım:

Node *n = nw->node; 

veya

Node n = *(nw->node); 
+0

ondan veri almak veya eklemek daha fazla bilgi verebilir – AMH

+0

Merhaba, dediğim gibi nesnel c sınıfı kullandım, ama hiçbir nesne geri almaya çalışırken hiçbir şey döndürme \t Düğüm * object = (Düğüm *) [NodesArray objectAtIndex :] k; \t NSLog (object.Description); – AMH

13
örnek değişkenler olarak yapı değerlerle (sadece NSString işaretçiler tutar beri) Aslında özel bir sınıf oluşturabilir

. Sanırım daha mantıklı olur.

Ayrıca bu yapıları tutun NSValue s bir dizi oluşturabilir

şu şekildedir:

NSValue *structValue = [NSValue value:&myNode objCType:@encode(Node *)]; 
NSMutableArray *array = [[NSMutableArray alloc] initWithObject:structValue]; 

Ardından şu yapılar retreive edebilirsiniz:

NSValue *structValue = [array objectAtIndex:0]; 
Node *myNode = (Node *)[structValue pointerValue]; 
// or 
Node myNode = *(Node *)[structValue pointerValue]; 
+4

Vay. Bugün bir şey öğrendim. Korku veren! :-) –

+0

Teşekkürler! Bu kadar yararlı bulduğuna sevindim.) – Eimantas

39

bu sorun haline çalıştırdıktan sonra, ben rastladım Bu iş parçacığı yardımcı oldu, ama sonuçta bulduğum çözümden daha karmaşıktı.

Temel olarak NSValue, yapınızın sarıcısıdır, kendiniz yeni bir sınıf oluşturmanız gerekmez.

// To add your struct value to a NSMutableArray  
NSValue *value = [NSValue valueWithBytes:&structValue objCType:@encode(MyStruct)]; 
[array addObject:value]; 

// To retrieve the stored value 
MyStruct structValue; 
NSValue *value = [array objectAtIndex:0]; 
[value getValue:&structValue]; 

Bu cevabın bir sonraki kişiye biraz zaman kazandıracağını umuyorum.

+0

+1 Teşekkürler. Bu çözümü kullandım. – Griffin

+1

+1 Benim için iyi ve sorunsuz çalışıyor. –

+0

çok teşekkürler, bu yapıyı kapsüllemek için NSValue'yı ilk kez kullanıyorum. – Chauyan