2008-12-26 31 views
5

Câu hỏi này đã sinh ra trong số này one. Làm việc với danh sách các cấu trúc trong ca cao không đơn giản. Hoặc sử dụng NSArray và mã hóa/giải mã, hoặc sử dụng một mảng loại C và mất các mặt hàng của NSArray. Structs được cho là đơn giản, nhưng khi một danh sách là cần thiết, người ta sẽ có xu hướng xây dựng một lớp học thay thế.Việc sử dụng danh sách các cấu trúc có ý nghĩa trong ca cao không?

Khi nào việc sử dụng danh sách cấu trúc có ý nghĩa trong ca cao?

Tôi biết đã có nhiều câu hỏi liên quan đến cấu trúc và lớp học, và tôi đã đọc người dùng cho rằng đó là câu trả lời tương tự cho mọi ngôn ngữ, nhưng ít nhất ca cao nên có câu trả lời cụ thể cho riêng mình, nếu chỉ vì KVC hoặc ràng buộc (như Peter đã gợi ý về câu hỏi đầu tiên).

+0

KVC và Bindings không phải là hai lý do duy nhất để biến một thứ thành một đối tượng. Trong số những người khác là có thể đặt nó trong một đối tượng bộ sưu tập mà không cần phải hộp/unbox. Bạn cũng có thể kiểm tra dễ dàng cho dù một cái gì đó là một đối tượng thuộc loại đó - không thể với các cấu trúc. –

Trả lời

11

Ca cao có một số loại phổ biến là cấu trúc, không phải đối tượng: NSPoint, NSRect, NSRange (và các đối tác CG của chúng).

Khi nghi ngờ, hãy làm theo hướng dẫn của Cocoa. Nếu bạn thấy mình đối phó với một số lượng lớn các đối tượng nhỏ, chủ yếu là dữ liệu, bạn có thể muốn làm cho các cấu trúc đó thay vì hiệu quả.

Sử dụng NSArray/NSMutableArray làm vùng chứa cấp cao nhất và gói cấu trúc trong NSValue có thể sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều. Tôi sẽ chỉ đi đến một mảng loại C thẳng nếu bạn thấy NSArray là một nút cổ chai hiệu suất, hoặc có thể nếu mảng về cơ bản là chỉ đọc.

1

Nói chung, việc sử dụng cấu trúc ngụ ý sự tồn tại của một kiểu dữ liệu tương đối đơn giản không có logic liên kết với nó và cũng không có bất kỳ logic nào liên kết với nó. Lấy ví dụ NSPoint - nó chỉ đơn thuần là biểu diễn (x, y). Với điều này, cũng có một số vấn đề phát sinh từ việc sử dụng nó. Nói chung, điều này là phù hợp với loại dữ liệu này vì chúng ta thường quan sát sự thay đổi về điểm thay vì tọa độ y của một điểm (về cơ bản, (0,1) không giống với (1,1) được dịch chuyển xuống 1 đơn vị). Nếu đây là một hành vi không mong muốn, bạn nên sử dụng một lớp học.

2

Đôi khi rất thuận tiện và hữu ích khi sử dụng cấu trúc, đặc biệt khi bạn phải thả xuống C, chẳng hạn như khi làm việc với thư viện hiện có hoặc thực hiện công cụ cấp hệ thống. Đôi khi bạn chỉ muốn có một cấu trúc dữ liệu nhỏ gọn mà không cần phí của một lớp. Nếu bạn cần nhiều phiên bản của các cấu trúc như vậy, nó có thể tạo ra một tác động thực sự đến hiệu năng và bộ nhớ.

Một cách khác để thực hiện một loạt các cấu trúc là sử dụng lớp NSPointerArray. Phải mất một chút suy nghĩ để thiết lập nhưng nó hoạt động khá giống như một NSArray sau đó và bạn không phải bận tâm với boxing/unboxing hoặc gói trong một lớp để truy cập dữ liệu thuận tiện hơn, và nó không chiếm thêm bộ nhớ của một lớp.

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory | 
          NSPointerFunctionsStructPersonality | 
          NSPointerFunctionsCopyIn]; 
pf.sizeFunction = keventSizeFunction; 
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf]; 
+0

Đối với những người đang sử dụng iPhone SDK: NSPointerArray không khả dụng cho iPhone. – Felixyz

+2

NSPointerArray có sẵn trên iPhone trong iOS 6.0 + – afarnham

Các vấn đề liên quan