2009-06-26 25 views
11

Tôi tin rằng tôi hiểu các thuộc tính cho hầu hết các phần. Câu hỏi của tôi là, nếu tôi có một thuộc tính cho một biến mẫu và tôi đang thiết lập hoặc lấy nó từ bên trong một phương thức trong tệp triển khai của tôi, tôi có nên sử dụng self.myProperty hoặc chỉ myProperty không? Tôi biết một trong hai công trình, nhưng tôi đã thấy các công ước hỗn hợp, đôi khi mã truy cập trực tiếp biến và các lần khác thông qua tài sản.Tôi có nên sử dụng từ khóa tự (thuộc tính) trong quá trình triển khai không?

Có lý do kỹ thuật để thực hiện việc này không? Nó chỉ là quy ước/sở thích cá nhân? Và tôi không đề cập đến các trường hợp tên tham số của phương thức va chạm với tên biến mẫu, có thể là một lý do để sử dụng thuộc tính (Ít nhất, bằng các ngôn ngữ khác, tôi không biết về điều này). Tôi giả sử rằng khi sử dụng thuộc tính trong quá trình triển khai, họ muốn tận dụng cách thức mà họ tuyên bố thuộc tính (tức là nonatomic, giữ lại), ví dụ như phương pháp, có thể thực hiện:

self.myProperty = [someObject someAutoReleasedObject]; 

thay vì:

myProperty = [[someObject someAutoReleasedObject] retain]; 

đây có phải là lý do? Vì vậy, chỉ có những tình huống nhất định trong đó nó sẽ là tốt để sử dụng tài sản?

Tôi mới tham gia Objective-C và đây là một trong số ít điều khiến tôi bối rối. Cho đến nay tôi đã chỉ truy cập vào biến cá thể trực tiếp, theo giả định có khả năng sai nhất mà đi qua thuộc tính thực sự gọi/gửi một phương thức/thông điệp và thêm phí không cần thiết. Tôi khá chắc chắn tôi sai với điều này, nhưng ngay cả khi sự khác biệt trong chi phí là không đáng kể (Nếu có, ngay cả bất kỳ), tại sao một trong những lựa chọn để thêm nó trong khi người ta có thể chỉ đơn giản là trực tiếp truy cập vào biến?

Tôi khá chắc rằng mình đã sai trong suy nghĩ của mình, đó là lý do tôi hỏi tại đây.

+0

Tôi không có dữ liệu để xác nhận điều này, nhưng theo tài liệu từ Apple:. "Trong phương pháp bạn có thể trực tiếp truy cập vào các biến thể hiện của trường hợp của lớp học của bạn Tuy nhiên, phương pháp truy cập được khuyến khích thay vì truy cập trực tiếp, ngoại trừ trong trường hợp hiệu suất là tối quan trọng. " Tham khảo: http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjCTutorial/10AppendixA/10AppendixA.html –

+0

Ah được rồi, cảm ơn. Đó sẽ là tốt hơn như là một câu trả lời mặc dù. –

+0

Quên thêm rằng nếu bạn đang phát triển Cocoa sử dụng KVO hoặc bindings, bạn nên sử dụng "self" thay vì truy cập trực tiếp vì Key-Value Observing và Cocoa Binding phụ thuộc vào phương thức accessor được gọi để đồng bộ hóa các cập nhật/thay đổi. –

Trả lời

5

Trước tiên, bạn không nên sử dụng bộ định cư hoặc getters trong init hoặc dealloc theo tài liệu của Apple (và vì lý do chính đáng).

Khác với điều đó, bạn thường nên sử dụng công cụ đặt để đặt biến nếu có.

Thông thường, tôi không bận tâm khi sử dụng trình thu thập để truy cập ivar từ bên trong triển khai, nhưng có những lúc cần thiết. Đặc biệt, nếu bạn mong đợi getter có thể thực hiện một số phép tính hoặc kiểm tra, hoặc nếu bạn muốn cho phép các lớp con ghi đè hành vi.

Chắc chắn, việc sử dụng trình thu thập dữ liệu trong triển khai tổng quát hơn và an toàn hơn, nhưng nó cũng thường vô nghĩa và lãng phí. Hãy lựa chọn.

Sử dụng trình setter rất quan trọng vì nó cung cấp cho opertunity mã khác để quan sát các thay đổi (Key Value Observing), cũng như các lớp con có cơ hội ghi đè lên setter và thực hiện bất kỳ điều chỉnh nào khác.

Tuy nhiên một điều tôi khuyên bạn nên sử dụng tên khác cho ivar và tài sản của bạn. Quy ước bình thường là tiền tố gạch dưới (_), mặc dù cá nhân tôi sử dụng i_ làm tiền tố để tránh bất kỳ sự nhầm lẫn nào với việc sử dụng riêng tư của Apple. Bằng cách đó bạn có thể không vô tình sử dụng sai một:

self.name // use property 
i_name // use ivar 
self.i_name // syntax error 
name // syntax error 
+0

Cảm ơn Peter lần nữa vì đã trả lời một trong những câu hỏi của tôi. Nếu không có ai khác cung cấp giải thích kỹ lưỡng hơn sớm, tôi sẽ đánh dấu bạn là câu trả lời. Nhân tiện, để tạo bí danh cho các thuộc tính như trong ví dụ trên, tôi sẽ làm @synthesize name = i_name; đúng? Ngoài ra, bạn có thể giải quyết các giả định có khả năng sai lầm nhất của tôi được đề cập trong bài đăng gốc của tôi để xóa bỏ sự nhầm lẫn không? Cảm ơn tôi đánh giá cao nó. –

+1

Có, @synthesize name = i_name. –

0

Nếu bạn đang phơi bày tài sản với thế giới bên ngoài và bạn đang sử dụng nó trong nội bộ, bạn nên sử dụng thuộc tính trong suốt mã của mình. Lý do là đóng gói. Giả sử bạn có thuộc tính "Id" cho SomeObj. Nói một lúc nào đó bạn quyết định thay thế cách hành xử của Id (có thể bạn đã bắt đầu với Id là một thành viên var của lớp và thông qua sự tiến hóa, nó sẽ trở thành một phần dữ liệu được lấy ra từ cơ sở dữ liệu). Bây giờ bạn phải đi qua việc thực hiện lớp của bạn và thay thế tất cả các tham chiếu đến thành viên var với các cuộc gọi cơ sở dữ liệu. Nếu bạn có self.Id, bạn chỉ cần phải ghi đè lên getter.