Eiko và những người khác đã đưa ra câu trả lời chính xác.
Đây là một cách đơn giản hơn: Truy cập trực tiếp vào biến thành viên riêng.
Thí dụ
Trong tệp .h tiêu đề:
@property (strong, nonatomic, readonly) NSString* foo;
Trong tệp .m triển khai:
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
Vậy đó, đó là tất cả những gì bạn cần. Không có rối rắm, không ồn ào.
Chi tiết
Kể từ Xcode 4.4 và LLVM Compiler 4.0 ( Các tính năng mới trong Xcode 4.4 ), bạn không cần phải làm việc nhà được thảo luận trong các câu trả lời khác:
- Các
synthesize
từ khóa
- Khai báo một biến
- Khai báo lại thuộc tính trong tệp .m.
Sau khi khai báo một thuộc tính foo
, bạn có thể giả sử Xcode đã thêm một biến thành viên riêng được đặt tên với tiền tố là dấu gạch dưới:_foo
.
Nếu thuộc tính được khai báo readwrite
, Xcode tạo ra một phương thức getter có tên foo
và một setter có tên setFoo
. Các phương thức này được gọi ngầm khi bạn sử dụng ký hiệu dấu chấm (Object.myMethod của tôi). Nếu thuộc tính đã được khai báo readonly
, không có bộ cài đặt nào được tạo. Điều đó có nghĩa là biến ủng hộ, được đặt tên với dấu gạch dưới, không phải là bản thân nó chỉ đọc. Cácreadonly
có nghĩa đơn giản là không có phương thức setter nào được tổng hợp và do đó việc sử dụng ký hiệu dấu chấm để đặt giá trị không thành công với lỗi trình biên dịch. Ký hiệu dấu chấm không thành công vì trình biên dịch ngăn bạn gọi một phương thức (bộ thiết lập) không tồn tại.
Cách đơn giản nhất để giải quyết vấn đề này là truy cập trực tiếp vào biến thành viên, được đặt tên bằng dấu gạch dưới. Bạn có thể làm như vậy ngay cả khi không khai báo biến có tên gạch dưới đó! Xcode đang chèn khai báo đó như một phần của quá trình xây dựng / biên dịch, vì vậy mã đã biên dịch của bạn thực sự sẽ có khai báo biến. Nhưng bạn không bao giờ thấy phần khai báo đó trong tệp mã nguồn ban đầu của mình. Không phải phép thuật, chỉ là đường cú pháp .
Sử dụng self->
là một cách để truy cập một biến thành viên của đối tượng / cá thể. Bạn có thể bỏ qua điều đó và chỉ sử dụng tên var. Nhưng tôi thích sử dụng self + arrow hơn vì nó làm cho mã của tôi tự ghi lại. Khi bạn nhìn thấy self->_foo
bạn biết mà không mơ hồ rằng đó _foo
là một biến thành viên trên trường hợp này.
Bằng cách này, thảo luận về ưu và nhược điểm của accessors tài sản so với truy cập Ivar trực tiếp chính là loại điều trị chu đáo bạn sẽ đọc trong Tiến sĩ Matt Neuberg 's Lập trình iOS cuốn sách. Tôi thấy rất hữu ích khi đọc và đọc lại.