2009-07-16 80 views
1

我想知道是否有任何示例代碼用於實現類型爲struct的NSMutableArray的Objective-C。在裏面,我需要在結構中聲明2個可變數組(也可以通過NSMutableArray)。我書中的所有代碼示例都向我展示瞭如何通過C數組語法(使用括號)創建一個定義大小的數組,但我不知道如何使用NSMutableArray獲得一個數組。有沒有其他人做過?這是我的代碼到目前爲止......編譯好我已經定義了數組的大小(在我的代碼中使用了2和5作爲示例,但我需要設置它,以便我可以讓它們變爲可變的。簡單的結構,當他們只是有一些「易於理解」的數據類型,比如int,double,short,long,BOOL(你明白了),當它變成指針時,這就是我迷失的地方可以使用指針,但知道如何將它們放在一個結構中是困難的部分)一旦代碼與NSMutableArray的工作,我會把「網絡」作爲一個指針鍵入「網絡」在接口?我之前嘗試過,但我得到的錯誤。最後,我基本上希望能夠寫如何寫一個包含NSMutableArray的結構類型的NSMutableArray呢?

network.input[2].list[1].value = 5.0; 
任意定義類型的數組「網絡」上

。誰能提供建議或鏈Tj o有關製作一個包含兩個NSMutableArray結構的「Network」類型的NSMutableArray的信息?謝謝你的幫助!

SomeFile.h

#import <Foundation/Foundation.h> 

struct lists{ 
    double value; 
}; 

// supporting structs 
struct inputs{ 
    struct lists list[2]; 
}; 

struct Network { 
    struct inputs input[5]; 
    struct lists output[5]; 
} 

@interface SomeFile : NSObject { 

} 

@end 

SomeFile.m

#import "SomeFile.h" 
@implementation SomeFile 
@end 

回答

1

這不是一個完整的答案;我不確定你的意思是不知道如何在結構中加入指針。我將繼續假設您想用多個輸入和輸出的動態數字來建模一個網絡。

您有幾種選擇在這裏:

  1. 使用值對象,而不是結構來存儲你的價值觀:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]]; 
    
  2. 型號您的網絡中與對象:

    @interface Network : NSObject { 
        // ivars 
    } 
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex; 
    - (double) outputAtIndex:(NSInteger)index; 
    @end 
    
  3. 只需使用像你一樣的結構;如果你需要改變大小的前期,用你的朋友的malloc:

    struct Network_value { 
        double value; 
    } 
    
    struct Network { 
        struct Network_value **inputs; 
        struct Network_value *outputs; 
    }; 
    
    void Network_alloc(Network *n, unsigned inputs, unsigned input_values, unsigned outputs) { 
        n->outputs = calloc(sizeof(Network_value), outputs); 
        n->inputs = calloc(sizeof(Network_value *), inputs); 
        while (inputs --> 0) { 
         n->inputs[inputs] = calloc(sizeof(Network_value), input_values); 
        } 
    } 
    
    void Network_free(Network *n, unsigned inputs) { 
        free(n->outputs); 
        while (inputs --> 0) { 
         free(n->inputs[inputs]); 
        } 
        free(n->inputs); 
    } 
    
    Network network; 
    Network_alloc(&network, 5, 2, 5); 
    
    network.inputs[2][1].value = 5.0; 
    
    Network_free(&network, 2); 
    
  4. 通過呈現網絡對象合併的想法2和3,但在內部存儲值與結構。如果輸入和輸出的數量非常大,這可能是一個好主意。

+0

我強烈建議設計垃圾收集以及。而不是malloc和calloc,最好調查NSAllocateCollectable和NSMakeCollectable。 – 2009-07-16 18:43:03

2

的NSArray和NSMutableArray中只能包含的Objective-C的對象,所以你不能存儲結構在其中。如果內容必須是結構體並且您想要類似於NSArray的內容,請使用在10.5和更高版本中提供的NSPointerArray

與任何其他指針類型一樣,您可以在指針內存儲指向Objective-C對象的指針(如NSPointerArray*id)。例如,你可以聲明一個struct來存儲一個Objective-C的對象像這樣的雙向鏈表節點:

typedef struct DoublyLinkedListNode { 
    id object; 
    __strong struct DoublyLinkedListNode *next; 
    __strong struct DoublyLinkedListNode *prev; 
} DoublyLinkedListNode; 

__strong屬性在Objective-C的2.0與垃圾收集連接使用,因爲指針到Objective-C對象充當強引用,但C指針類型不默認。這樣,只要列表中的一個節點通過__strong引用引用,列表就不會消失。 (請閱讀Garbage Collection Programming Guide瞭解詳細信息,尤其是的後半部分使用垃圾收集核心基礎。)您可能會考慮爲您的結構進行此操作。

至於你想要的語法,我可能沒有完全理解你的問題,但是你將不能使用括號語法來訪問Cocoa集合中的對象,比如NSPointerArray。 (另外,你必須使用「->」運算符而不是「.」作爲結構體,因爲它們很可能被分配到堆中。所有的Objective-C對象都必須是,我們希望將這些結構存儲在方法的局部範圍之外)。

由於Objective-C沒有泛型,所以也不能「實現一個類型爲struct的NSMutableArray」。事實上,one of your previous SO questions有關於這個問題的更多細節。如果這不是你的意思,請隨時澄清。

相關問題