Tôi có nhiều năm kinh nghiệm trong Obj-c và Cocoa, nhưng bây giờ tôi mới trở lại và Obj-C 2.0, v.v. đầu của tôi xung quanh thời gian chạy hiện đại và tuyên bố tài sản, vv Một điều mà confuses tôi một chút là khả năng trong thời gian chạy hiện đại để có iVars tạo ra ngầm. Và tất nhiên điều này ngụ ý rằng trong mã của bạn, bạn nên luôn sử dụng self.property để truy cập vào giá trị.Sử dụng các biến mẫu với Thời gian chạy hiện đại
Tuy nhiên, trong các phương thức init * và dealloc (giả sử bạn không sử dụng GC), chúng tôi nên sử dụng trực tiếp iVar (trong thời gian chạy hiện tại).
Vì vậy, câu hỏi là:
Chúng ta có nên sử dụng accessors tài sản trong init * và dealloc với Modern Runtime?
Nếu vậy, tại sao điều này lại khác? Có phải chỉ vì trình biên dịch không thể nhìn thấy iVar?
Nếu tôi cần ghi đè người truy cập, tôi vẫn có thể truy cập iVar đó sẽ được xác định khi chạy hoặc tôi có phải xác định iVar thực tế mà thời gian chạy sau đó sẽ sử dụng không?
Một lần nữa, nếu tôi có thể truy cập vào được tổng hợp Ivar, tại sao tôi không thể tiếp tục làm việc này cho các * init và phương pháp dealloc?
Tôi đọc tài liệu nhiều lần, nhưng dường như họ mơ hồ về tất cả điều này và tôi muốn chắc chắn rằng tôi hiểu rõ điều này để quyết định cách tôi muốn tiếp tục mã hóa.
Hy vọng rằng câu hỏi của tôi rõ ràng.
Nhanh chóng tóm tắt của thử nghiệm:
Nếu bạn không khai báo Ivar trong di sản, trình biên dịch là hoàn toàn không hài lòng
Nếu bạn sử dụng
#ifndef __OBJC2__
xung quanh Ivar trong trình biên dịch di sản vui vẻ và bạn có thể sử dụng cả trực tiếp ivar và làm thuộc tínhTrong runtime hiện đại, bạn có thể rời khỏi Ivar undefined và truy xuất thuộc tính
Trong thời gian chạy hiện đại, cố gắng truy cập Ivar trực tiếp mà không khai báo cho lỗi trong quá trình biên dịch khai
@private
của Ivar, tất nhiên, cho phép truy cập trực tiếp ivar, trong cả di sản và hiện đại
Không thực sự đưa ra một cách sạch sẽ để tiến lên ngay bây giờ phải không?
Để làm rõ những người có thể nhầm lẫn, "Thời gian chạy hiện đại" đề cập đến thời gian chạy Objective-C mới có thể * * được sử dụng bởi các ứng dụng iPhone và các quy trình 64 bit trên 10.5 trở lên. Bất kỳ mã Objective-C nào chạy trong 32 bit hoặc trên Tiger hoặc trước đó đều chạy trong "Thời gian chạy cũ". –
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html –
@Quinn - Tôi không biết rằng hệ điều hành iPhone sử dụng thời gian chạy hiện đại. Điều đó khá ngọt ngào. –