Mục lục:
- Tài sản tuyên bố là gì
- Chuyến đi * thisTrip = appDelegate. chuyến đi;
- Ví dụ: nếu bạn có quá nhiều chi phí để tạo ra một đối tượng không thể sử dụng, bạn có thể tạo bộ truy cập getter riêng của bạn để tạo ra đối tượng trong lần truy cập đầu tiên.Ngoài ra, viết accessor của riêng bạn có nghĩa là bạn không cần phải có một biến dụ liên quan đến tài sản.
- _currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
Video: Trải nghiệm thực tế Realme 5 như thế nào? 2025
Mặc dù tài sản và truy cập và accessors mẫu thường được nghiền ngẫm trong tâm trí của ứng dụng iOS lập trình viên, đảm bảo rằng bạn hiểu bản chất độc đáo của tài sản và cách họ thực sự làm việc.
Trong khi phương pháp liên quan đến việc gửi tin nhắn đến các đối tượng để thực hiện công việc, thuộc tính liên quan đến trạng thái của vật thể. Frameworks và các đối tượng khác hoạt động dựa trên những gì chúng tìm thấy trong thuộc tính của chúng (do đó bạn có thể sửa đổi hành vi của đối tượng bằng cách thay đổi thuộc tính).
Bạn cũng có thể muốn biết điều gì đó về trạng thái của đối tượng, chẳng hạn như màu sắc của nó, hoặc về trình điều khiển chế độ xem gốc của cửa sổ.
Bộ điều khiển chế độ xem của ứng dụng, đóng vai trò cầu nối giữa chế độ xem và mô hình, cần phải có khả năng tìm đối tượng mô hình để lấy dữ liệu và gửi bản cập nhật. Tất cả điều này được thực hiện bằng cách sử dụng các thuộc tính. Một tài sản trông như sau:
@ tài sản (mạnh, nonatomic) IBOutlet UIImageView * xe hơi;
Nhưng không phải tất cả các tài sản đều là đại lý. Nếu bạn chọn RTAppDelegate. h trong thanh tra của Dự án, bạn có thể thấy nó bao gồm một thuộc tính:
@ tài sản (mạnh mẽ, không tự nhiên) UIWindow * cửa sổ;
Như bạn thấy, thứ tự của các thuộc tính (mạnh, nonatomic so với nonatomic, mạnh mẽ) không quan trọng.
Tài sản tuyên bố là gì
Tài sản tuyên bố có hai phần: tuyên bố và việc thực hiện của nó.
Tuyên bố sử dụng từ khóa @property, sau đó là một bộ các thuộc tính được đặt trong ngoặc đơn, thông tin loại, và tên của thuộc tính.
Các tên mặc định cho các phương thức getter và setter liên kết với một thuộc tính làwhateverThePropertyNameIs cho các bộ định tuyến getter và setWhateverThePropertyNameIs: . Trong trường hợp chuyến đi, phương thức getter là trip, và phương thức setter là setTrip:. Để truy cập tài sản chuyến đi trong appDelegate, bạn sẽ sử dụng
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; Chuyến đi * thisTrip = [appDelegate trip];
hoặc để thiết lập thuộc tính đó, sử dụng
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; [appDelegate setTrip: newTrip];
Sử dụng dấu chấm
Mục tiêu-C cung cấp một toán tử dấu chấm (.) Cung cấp một sự thay thế cho ký hiệu dấu ngoặc vuông ([] để gọi các phương thức accessor. Bạn sử dụng cú pháp dấu chấm giống như cách bạn muốn khi truy cập vào phần tử cấu trúc C:
Chuyến đi * thisTrip = appDelegate. chuyến đi;
hoặc để thiết lập thuộc tính đó, sử dụng
appDelegate. trip = newTrip;
Khi được sử dụng với các đối tượng, dấu chấm hoạt động như là "cú pháp đường" - nó được biến đổi bởi trình biên dịch thành một thông điệp accessor. Cú pháp dấu chấm không trực tiếp lấy hoặc đặt một biến thể. Các ví dụ mã bằng cách sử dụng nó là chính xác tương đương với việc sử dụng các ký hiệu khung.
Nhiều người lập trình thích cú pháp dấu chấm bởi vì nó có thể dễ đọc hơn; chỉ cần suy nghĩ về những tình huống ghi chú khung nơi bạn đang truy cập vào một thuộc tính là thuộc tính của đối tượng khác (bản thân nó là thuộc tính của một đối tượng khác, v.v …).
Tuy nhiên, lợi thế thực sự của cú pháp dấu chấm là trình biên dịch sẽ tạo ra lỗi
khi phát hiện ra một cố gắng viết thư tới một thuộc tính đã khai báo chỉ đọc. Điều này tốt hơn nhiều so với việc phải giải quyết cho một phương pháp cảnh báo không công bố bởi vì bạn đã gọi phương thức setter không tồn tại, với ứng dụng sau đó không chạy được. Khi bạn sử dụng trình biên dịch để tạo các phương thức accessor cho bạn, trình biên dịch sẽ tạo ra một biến thể của kiểu mà bạn đã tuyên bố rằng nó sẽ sử dụng để lưu trữ và lấy giá trị thuộc tính với tên của thuộc tính. Ví dụ cho thuộc tính sau: @ tài sản (yếu, nonatomic) IBOutlet UIImageView * xe;
tuyên bố
đồng bộ hoá xe;
tạo ra một biến thể với tên xe loại UIImage.
Tuy nhiên, nếu bạn để trình biên dịch tự động tạo ra một lệnh @synthesize cho bạn, nó thực sự sử dụng một tên biến ví dụ bắt đầu với một ký tự gạch dưới, vì vậy bạn sẽ nhận được mã sau đây được tạo ra cho bạn sau hậu trường:
@ tổng hợp xe = _car;
Điều này cho phép bạn phân biệt giữa tên thuộc tính (truy cập bởi self.car) và tên biến dụ (được truy cập đơn giản là _car).
Apple khuyên bạn nên sử dụng tham chiếu thuộc tính (self.car) theo các phương pháp bình thường, nhưng sử dụng biến _car trong phương thức init. Điều này chỉ áp dụng cho mã trong một tệp. Mã ở nơi khác trong ứng dụng của bạn truy cập tài sản do nó được khai báo trong phần @interface của. h.
Không có cách nào mã bất kỳ nơi nào trong ứng dụng ngoại trừ. m của một lớp học có thể truy cập trực tiếp biến dụ khi bạn cho trình biên dịch thực hiện công việc. Và đó là một điều tốt để đảm bảo rằng đóng gói được cung cấp đúng cách.
Viết người truy cập của bạn
Bạn không phải sử dụng accessors do trình biên dịch tạo ra; và, đôi khi, nó thậm chí làm cho tinh thần để thực hiện chúng mình. Nếu bạn tự thực hiện các phương pháp accessor, bạn nên đảm bảo rằng phương pháp của bạn phù hợp với các thuộc tính mà bạn đã khai báo.
Ví dụ: nếu bạn có quá nhiều chi phí để tạo ra một đối tượng không thể sử dụng, bạn có thể tạo bộ truy cập getter riêng của bạn để tạo ra đối tượng trong lần truy cập đầu tiên.Ngoài ra, viết accessor của riêng bạn có nghĩa là bạn không cần phải có một biến dụ liên quan đến tài sản.
Bạn có thể, ví dụ, có một thuộc tính vùng trên một đối tượng đại diện cho một hình chữ nhật. Getter cho khu vực có thể thực hiện chiều dài x chiều rộng và không bao giờ bận tâm với một biến dụ.
Truy cập các biến dụ với accessors
Nếu bạn không sử dụng self, bạn truy cập trực tiếp biến instance. Trong ví dụ sau, phương thức accessor thiết lập cho _currentDestinationIndex không được triệu gọi:
_currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
Sự so sánh trước không giống với
tự. currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
Để sử dụng accessor, bạn phải sử dụng self.