2011-09-21 28 views
8

Theo như tôi hiểu @property khai báo getter và setter trong tệp .h và @synthesize thực hiện getter và setter trong các tệp .m. Hơn nữa, bạn có thể viết thực hiện của riêng bạn cho getter và setter thay vì sử dụng @synthesize.Mục tiêu-C: Tuyên bố @property mà không cần triển khai (@synthesize)

Vì vậy, nếu chúng ta luôn cần triển khai setter/getter tại sao chúng ta cần phải khai báo bổ sung? @property dường như là dự phòng ngữ nghĩa đối với tôi và một nguồn cho lỗi.

Điều gì sẽ xảy ra khi tôi khai báo @property nhưng quên triển khai bằng @synthesize hoặc thủ công? Điều gì sẽ xảy ra khi tôi sử dụng @synthesize và quên tuyên bố @property?

Trả lời

26

Thuộc tính hiện được tổng hợp theo mặc định, vì Xcode 4.4, vì vậy có, bạn đã đúng, dự phòng và Apple đã xóa cần phải viết cả @property và @synthesize, chỉ cần sử dụng @property từ bây giờ.

+0

tốt đẹp mà họ đã thêm điều này. Cảm ơn bạn đã trả lời –

+8

Vẫn còn một trường hợp bạn sẽ cần sử dụng cả thuộc tính và tổng hợp lại với nhau. Trình biên dịch sẽ sử dụng tên thuộc tính cộng với tiền tố gạch dưới để tạo ra ngà voi. Nếu _propertyname ivar va chạm với một biến cá thể riêng, bạn sẽ cần phải tổng hợp nó thành một thanh công cụ mới. Ví dụ: nếu bạn đang phân lớp UIToolbar và khai báo một thuộc tính đặt tên nó là delegate, bạn sẽ gặp lỗi khi cố gắng sử dụng ivar _delegate vì UIToolbar chứa một biến cá thể riêng id _delegate. Bạn có thể giải quyết điều này bằng cách sử dụng '@synthesize delegate = _mydelegate;'. – lolol

4

Điều gì sẽ xảy ra khi tôi khai báo @property nhưng quên triển khai tính năng này với @synthesize hoặc theo cách thủ công? Điều gì sẽ xảy ra khi tôi sử dụng @synthesize và quên tuyên bố @property?

Tại sao bạn không thử? Nếu bạn quên tổng hợp các accessors hoặc cung cấp cho riêng bạn, trình biên dịch sẽ cảnh báo bạn. (Và nếu bạn đã thiết lập để coi cảnh báo là lỗi, đó là một ý tưởng hay, không thể bỏ lỡ cảnh báo.) Trường hợp thứ hai thường dẫn đến lỗi biên dịch.

Vì vậy, nếu chúng ta luôn cần triển khai setter/getter tại sao chúng ta cần phải bổ sung khai báo? @property dường như là dự phòng về mặt ngữ nghĩa với số tôi và một nguồn lỗi.

Để đơn giản, @property là khai báo thuộc tính và @synthesize là một trong những triển khai có thể thực hiện được. Một thuộc về tiêu đề (= mô tả giao diện công khai), phần còn lại của tệp triển khai. Làm thế nào bạn sẽ làm điều đó nếu không theo cách này?

6

có dưới đây trong .h tập tin

@property (retain, nonatomic) NSString* userName; 

là cú pháp đường cho

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 

trong file .h

@synthesize trong .m là cú pháp đường để rời cho riêng mình thực hiện bằng cách tôn trọng retain, nonatomic, v.v. như được chỉ định trong tuyên bố tài sản của bạn.

bạn không thể tổng hợp với @property, ngay cả khi bạn đã chỉ định trình thu thập phù hợp, chữ ký setter trong tệp .h.

Nhưng bạn có thể rời @synthesize và triển khai trình dọn dẹp và thiết lập của riêng bạn.

Nếu bạn đã thực hiện cả hai @synthesize và cũng có thể đặt tùy chỉnh getter, thời gian chạy tôn trọng việc triển khai của bạn và gọi giống nhau.

+0

giải thích tốt đẹp – onmyway133

2

Chỉ muốn thêm rằng bạn cũng có thể sử dụng @dynamic thay vì @synthesize, mặc dù điều này rất hiếm khi bạn cần phải làm gì đó. @dynamic về cơ bản nói với người khiếu nại rằng bạn đang bằng cách nào đó sẽ đảm bảo rằng các cuộc gọi tới getters và setters sẽ được thực hiện tại thời gian chạy, hoặc bằng cách tự tạo chúng hoặc bằng cách thực hiện thêm một số các tính năng đặc biệt của thời gian chạy Objective C.

+0

Tôi quan tâm đến điều đó "bằng cách nào đó". Tôi muốn quay lại một số thuộc tính kiểu dấu chấm với một từ điển và thất bại hoàn toàn. Có lẽ trái cây cho một câu hỏi. –

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