2012-10-04 21 views
8

Tôi rất mới với Mục tiêu C. (Hai ngày nay). Khi đọc về @synthesize, nó dường như trùng lặp với sự hiểu biết của tôi @property (mà tôi nghĩ rằng tôi hiểu) ... Vì vậy, một số chi tiết cần phải được ironed ra trong tâm trí của tôi ... nó bugging tôi.@property và @synthesize

Xin vui lòng sửa tôi nếu tôi sai về sự khác biệt của @property@synthesize:

Nếu bạn khai báo một @property trong @interface của bạn, sau đó bạn nói với thế giới rằng người dùng có thể mong đợi để sử dụng thu khí tiêu chuẩn và setters cho tài sản đó. Hơn nữa, XCode sẽ tạo ra các getters và setters chung cho bạn. ... NHƯNG, Ở mức độ nào rằng xảy ra với khai báo @property? (IE Điều đó có nghĩa là "hoàn toàn" ... giống như tờ khai vô hình cho nó trong @interface của bạn, và cũng có thể đang vô hình trong bạn @interface?

-HOẶC-

Liệu @property chăm sóc tờ khai đang vô hình trong bạn @interface chỉ - trong khi @synthesize sẽ chăm sóc của việc thực hiện đang vô hình trong phần @implementation của bạn)

+3

Hãy nghĩ về điều này như thế này nếu bạn có 'thuộc tính' nhiều hơn khả năng bạn sẽ cần 'tổng hợp'. Điều này là bởi vì có '@ property' đang nói với thế giới rằng một' getter' và 'setter' chung là cần thiết nhưng' synthesize' thực sự đang tạo 'getters' và' setters', bạn có thể ghi đè lên điều này và tạo của riêng bạn 'getters' và' setters' nếu bạn thích như những cái được tạo ra sẽ rất cơ bản. Có một chiếc đồng hồ của iTunesU 'iPad và phát triển ứng dụng iPhone của Paul Hegarty' đây là cách tôi nghĩ về nó và nó đã không thất bại được nêu ra. – Popeye

+0

Cảm ơn rất nhiều Popeye ... ITunes U là FANTASTIC !!! Tôi đang thực sự ở bài 4 hoặc loạt năm 2011 của Paul. Tôi chỉ đang sao lưu, đọc XCode 4 Mục tiêu học tập C dọc theo bên này ... vẫn không rõ ràng với tôi. – RichWalt

Trả lời

7

@property tuyên bố một tài sản trên lớp học của bạn với bất cứ số nguyên tử và setter ngữ nghĩa mà bạn cung cấp.

Với Xcode 4.4, khả năng tự tổng hợp có sẵn trong đó bạn được cung cấp một tấm nền ủng hộ từ tài sản của mình mà không cần khai báo nó trong @synthesize. Thanh này có dạng _propertyName, trong đó tên thuộc tính của bạn là propertyName.

+0

Điều này đã chạm vào móng trên đầu, ngắn ngọt ngào và đơn giản. +1 – Popeye

+0

Có ... Tôi biết bạn có thể "quay lại tài sản của bạn var" với một loại ngà khác (nên được sử dụng bởi lớp của bạn, và đặc biệt là với getters và setters.) ... Cảm ơn rất nhiều vì phản ứng của bạn. .. Tôi đã choáng ngợp với tốc độ trả lời hữu ích trong ... (Đây là bài viết đầu tiên của tôi ở đây sau khi tham gia chỉ vài phút trước)! - Cảm ơn bạn đã dành thời gian để làm bài đăng này Alan! – RichWalt

16

Trước tiên, lưu ý rằng phiên bản mới nhất của Xcode không yêu cầu @synthesize nữa. Bạn có thể (và nên) chỉ bỏ qua nó. Điều đó nói rằng, đây là những gì các phần làm.

@property là khai báo của người truy cập. Nó chỉ là một tuyên bố. Có rất ít sự khác biệt giữa những điều sau đây:

@property (nonatomic, readwrite, strong) NSString *something; 

vs

- (NSString *)something; 
- (void)setSomething:(NSString)aSomething; 

Sự khác biệt chính là tuyên bố những phương pháp sử dụng @property cho phép trình biên dịch tự động tạo ra (tổng hợp) triển khai cho bạn. Không có yêu cầu mà bạn cho phép trình biên dịch làm điều đó cho bạn. Bạn hoàn toàn tự do thực hiện somethingsetSomething: một cách thủ công và điều này thường xảy ra. Tuy nhiên, nếu bạn không thực hiện chúng bằng tay, trình biên dịch sẽ tự động tạo một ngà voi cho bạn gọi là _something và tạo ra một triển khai hợp lý cho getter và setter.

Trong các phiên bản cũ hơn của Xcode, bạn phải yêu cầu rõ ràng việc tạo tự động bằng cách sử dụng từ khóa @synthesize. Nhưng điều đó không còn cần thiết nữa. Hôm nay, lý do duy nhất để sử dụng @synthesize là nếu bạn muốn ngà voi có tên không chuẩn (không bao giờ làm điều đó).

Điểm mấu chốt ở đây là các phương pháp somethingsetSomething:chỉ là các phương pháp. Không có gì huyền diệu về họ. Chúng không phải là "các phương thức đặc tính" đặc biệt."Chúng chỉ là phương pháp mà theo quy ước truy cập một phần của nhà nước. Đó là phần của nhà nước thường được lưu trữ trong một ivar, nhưng không cần phải.

Để được rõ ràng hơn: object.something không không có nghĩa là" trả lại ngà có tên là _something từ object. "Điều đó có nghĩa là" trả về kết quả của [object something], bất kể điều đó có nghĩa là gì. "Thông thường là để trả lại giá trị của một chiếc ngà. bên ngoài) bằng cách sử dụng tờ khai @property và bạn nên tránh khai báo trực tiếp các dấu gạch ngang. Bạn cũng nên luôn truy cập các thuộc tính của mình thông qua người truy cập (self.something), ngoại trừ các phương thức initdealloc. Trong initdealloc, bạn nên trực tiếp sử dụng ivar (_something).

+0

Rob, Cảm ơn rất nhiều vì đã dành thời gian và phản hồi của bạn. Xem video iOS trên iTunes U từ năm ngoái (2011) ... và cố gắng cập nhật những thay đổi đang diễn ra trong XCode khiến đôi khi có sự nhầm lẫn. Lắng nghe cẩn thận với người hướng dẫn, và thậm chí làm bài kiểm tra với mã đơn giản ... heck, thậm chí đọc tài liệu XCode cũng không hoàn toàn rõ ràng rằng @synthesis không cần thiết! Xác nhận hữu ích như của bạn thêm vào sự tự tin rằng tôi đã không tìm hiểu điều gì đó sai ... như tôi tiếp tục cùng. :-) Bây giờ ... nếu ai đó có một số liên kết bên ngoài, nơi tôi có thể bắt đầu suy nghĩ đúng về MVC - đó sẽ là tuyệt vời !! – RichWalt

+0

Bắt đầu tại đây: http://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html%23//apple_ref/doc/uid/ TP40010810-CH14. Sau đó, tại đây: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457 –

+0

Bây giờ, hãy xem xét điều này! Cảm ơn rất nhiều!!!! – RichWalt