2012-04-13 38 views
8

Tôi đang viết một chương trình Mục tiêu-C đề cập đến bộ nhớ hình ảnh mức thấp. Tôi đang sử dụng các cấu trúc ANSI-C để lưu trữ dữ liệu của mình - Các đối tượng đầy đủ có vẻ quá mức cần thiết khi dữ liệu tôi lưu trữ là 100% dữ liệu, không có phương pháp để vận hành trên dữ liệu đó. Cụ thể, tôi đang viết một thuật toán tùy biến áp dụng dựa trên một mảng màu sắc - Đây là nơi mọi thứ trở nên phức tạp. Tôi lưu trữ màu sắc của tôi như là cấu trúc của ba phao nổi, và một lá cờ nguyên (liên quan đến thuật toán posterization cụ thể). Everyhting đang tiến triển tốt, ngoại trừ một điều ...Thêm con trỏ C vào NSMutableArray

[thực tế câu hỏi]

tôi không thể tìm ra cách để thêm con trỏ đến một NSMutableArray! Tôi biết làm thế nào để thêm một đối tượng, nhưng thêm một con trỏ vào một cấu trúc có vẻ là khó khăn hơn - Tôi không muốn NSMutableArray dereferencing con trỏ của tôi và điều trị struct như một số loại đối tượng lạ. Tôi muốn NSMutableArray thêm con trỏ của nó vào bộ sưu tập của nó. Làm thế nào để tôi làm việc này?

Cảm ơn trước,

G

Trả lời

15

Có một lớp học được thiết kế một cách chính xác cho việc này: NSPointerArray. Xem tài liệu của Apple here. Đối với các con trỏ tùy ý, có thể bạn sẽ muốn sử dụng các tùy chọn NSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonality.

Nếu NSPointerArray là không có sẵn (ví dụ, nếu bạn đang phát triển dành cho iOS), sau đó bạn có thể bọc con trỏ của bạn sử dụng -[NSValue valueWithPointer:], miễn là các chi phí của gói & unwrapping không chứng minh quá chậm.

+0

Ôi! Tôi sẽ không bao giờ nghĩ! Tôi sẽ xem, thankyou :) –

+2

Ca cao có rất nhiều lớp sưu tập mà hầu hết mọi người bỏ lỡ - tôi thấy 'NSMapTable' đặc biệt hữu ích. Xem danh sách đầy đủ tại đây: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

Ồ! Cảm ơn bạn! Tôi sẽ phải nghiên cứu kỹ vào thời điểm đó - Một điều, tôi gặp vấn đề khi trình biên dịch nhận ra NSPointerArray như một kiểu - Bạn có biết phải nhập tập tin tiêu đề nào để nó được nhận diện không? –

4

Bạn có thể quấn con trỏ của mình trong các đối tượng NSValue.

+0

Thú vị! Cảm ơn bạn :) –

1

Nếu một NSMutableArray thực sự những gì bạn muốn, bạn có thể sử dụng phương pháp này:

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); 
} 

Tuy nhiên, bạn sẽ không muốn nhét NSObject s trong đó - họ sẽ không được giữ lại.

Sử dụng phương pháp này, các phần tử CF/NS-Array của bạn có thể là con trỏ hoặc bất kỳ giá trị nguyên thủy nào có kích thước bằng một con trỏ.

3

dụ:

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];