2012-04-05 44 views
6

Tôi có một tài sản mà tôi không tổng hợp, thay vào đó tôi tạo ra một getter và setter bản thân mình. Do đó, các từ khóa ARC (mạnh hoặc yếu) không có ý nghĩa, tôi giả sử, vì vậy tôi loại bỏ chúng. Điều này hoạt động tốt trên Xcode 4.3, nhưng khi đồng nghiệp của tôi mở chúng trên XCode 4.2, trình biên dịch phàn nàn rằng không có từ khóa mạnh/yếu, vì vậy tôi đã hướng dẫn anh ta nhập vào từ khóa một cách vô nghĩa. Điều gì là chính xác (có hoặc không có từ khóa)?Tôi có cần từ khóa ARC cho các thuộc tính mà tôi không tổng hợp không?

Để rõ ràng: Tôi có tài sản như thế này @property (nonatomic) NSString *foo và trong tệp .m Tôi triển khai -(NSString *)foo-(void)setFoo:(NSString *)foo và KHÔNG bao gồm @synthesize foo. Một chi tiết liên quan khác là không có iVar tương ứng, thay vào đó các thuộc tính tương tác với một đối tượng Dữ liệu cốt lõi. Điều này sẽ không biên dịch trong XCode 4.2 trừ khi tôi thêm mạnh hoặc yếu vào các từ khóa.

EDIT Tôi nghĩ về một điều có liên quan hơn, một trong những thuộc tính này là trên Giao thức, tôi không biết điều đó có tạo nên sự khác biệt hay không.

Trả lời

1

Thuộc tính được khai báo mà bạn đang tham chiếu là tùy chọn. Để trích dẫn tài liệu:

Tuyên bố tài sản và thực hiện
Chỉ thị @property tuyên bố một tài sản. Bộ thuộc tính được cung cấp tùy chọn cung cấp thêm chi tiết về lưu trữ ngữ nghĩa và các hành vi khác của thuộc tính - xem “Thuộc tính khai báo thuộc tính” để biết các giá trị có thể có.

Tuyên bố tài sản thuộc tính
Bạn có thể trang trí một tài sản với thuộc tính bằng cách sử dụng các hình thức @property(attribute [, attribute2, ...]). Giống như các phương pháp, các thuộc tính được sắp xếp theo kiểu khai báo kèm theo của chúng. Đối với các khai báo thuộc tính sử dụng danh sách được phân cách bằng dấu phẩy của các tên biến, thuộc tính thuộc tính áp dụng cho tất cả các thuộc tính có tên .

Nếu bạn sử dụng các chỉ thị @synthesize nói với trình biên dịch để tạo ra các phương pháp accessor (xem “Chỉ thực hiện tài sản”), mã nó tạo phù hợp với đặc điểm kỹ thuật đưa ra bởi các từ khóa. Nếu bạn tự thực hiện các phương thức truy cập, bạn nên đảm bảo rằng nó khớp với đặc điểm kỹ thuật (ví dụ: nếu bạn chỉ định bản sao, bạn phải đảm bảo rằng bạn sao chép giá trị đầu vào theo phương thức setter).

Nếu bạn sau đó sử dụng @dynamic thay vì @synthesize nó đang nói với trình biên dịch rằng bạn sẽ được viết phương pháp của riêng bạn và ngăn không cho nó phàn nàn khi nó không tìm phương pháp phù hợp.

Thông tin khác có thể được tìm thấy here.

+0

Thú vị ... Tôi sẽ thử thêm động và xem nó hoạt động trên XCode 4.2 – borrrden

+1

+1, câu trả lời rất rõ ràng – jmstone617

0

borrrden,

Trước tiên, tại sao bạn quan tâm đến chính sách bộ nhớ của mình trong tuyên bố tài sản? Nó thông báo cho người tiêu dùng về lớp học của bạn chính sách là gì. Bạn không muốn họ biết?

Thứ hai, @synthesize không phải là nop. Đây là cơ chế mà ngôn ngữ hỗ trợ KVO. Trong khi bạn có thể không sử dụng nó ngay bây giờ, tại sao bạn sẽ loại bỏ việc sử dụng này cho tương lai.

Thẳng thắn, bằng cách không sử dụng mô tả đầy đủ trong @property hoặc cũng không sử dụng @synthesize, bạn là IMO, tham gia vào tối ưu hóa sớm. Thiết kế hiện tại của bạn không tiết kiệm cho bạn thông điệp gửi đi và buộc bạn phải quản lý, nếu cần thiết, việc tạo và nhập mã vạch. Và bạn đang mất đi các tính năng của ngôn ngữ.

Trừ khi bạn có lý do chính đáng để vượt ra ngoài giới hạn của các mẫu Obj-C v2 + ưa thích và bạn chưa liệt kê các mẫu đó, thì tôi sẽ quay lại sử dụng mẫu chuẩn. Sau đó, vấn đề của bạn chỉ biến mất.

Andrew

+0

Có nhiều lý do rất hay để viết các phương pháp của riêng bạn. (Chẳng hạn như tính chất, xác nhận, vv) – lnafziger

+0

'@ synthesize' không có gì để làm với KVO. Bạn có thể sử dụng KVO mà không bao giờ viết '@ synthesize' và trong khi cung cấp các bộ định cư và getters tùy chỉnh của riêng bạn. –

+0

Nó không phải là về tối ưu hóa, nó là về logic. Không có iVars cho các thuộc tính này Các thuộc tính tương tác với các đối tượng Core Data bằng cách thiết lập các thuộc tính của chúng. Trong trường hợp này bạn có cho rằng chúng mạnh hay yếu? Có lẽ giống như thuộc tính đối tượng tiếp theo mà tôi đang thiết lập. Tôi không ngại viết chúng miễn là tôi không gây ra bất kỳ tác dụng phụ nào. – borrrden

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