Định nghĩa @property với ARC: mạnh hay giữ lại?


80

Sử dụng Xcode 4.2 và ARC, tôi nhận thấy rằng mã được tạo tự động cho an NSManagedObjectvẫn đọc như thế này cho các thuộc tính:

@property (nonatomic, retain) NSString * someString;

1) retainBây giờ không nên được thay thế bằng stronghoặc weak?

2) Tại sao mã được tạo tự động vẫn sử dụng retain

3) Sự thay thế chính xác cho retaincâu lệnh thuộc tính này là gì?

Tôi hiện đang gỡ lỗi sự cố bằng cách sử dụng NSFetchRequestvà tôi nghĩ đây có thể là nguồn gốc của sự cố. Suy nghĩ?


Bạn nên chấp nhận câu trả lời ngay bây giờ.
Rivera

Câu trả lời:


110

1) Không nên giữ lại bây giờ được thay thế bằng mạnh hay yếu?

Không. Bạn không thể thay thế giữ lại bằng yếu; họ khác nhau. Và mạnh mẽ là từ đồng nghĩa 100% với giữ lại; chúng giống hệt nhau. Bạn có thể sử dụng một trong hai, vì vậy không có "nên" ở đây. Bạn có thể thay thế giữ lại bằng mạnh nếu bạn thích, nhưng bạn không cần phải làm như vậy.

2) Tại sao mã được tạo tự động vẫn sử dụng được giữ lại

Tại sao không? Xem (1). giữ lại là chính xác nên không có vấn đề gì.

3) Sự thay thế chính xác để giữ lại trong câu lệnh thuộc tính này là gì?

Không cần phải thay thế giữ lại.

Tôi hiện đang gỡ lỗi sự cố bằng cách sử dụng NSFetchRequest và tôi nghĩ đây có thể là nguồn gốc của sự cố. Suy nghĩ?

Nó không phải.


9
Mặc dù vậy, tôi muốn tin rằng, đối với một cộng đồng bị ám ảnh (và đúng là như vậy!) Với các tiêu chuẩn và sự tuân thủ (các) Cách thức của Apple, việc chỉ giữ lại các mô hình tổng hợp là tiêu chí phụ. Tôi thay đổi thành mạnh mẽ chỉ để được tích cực. Đối với một, làm cho việc thực hiện một dự án lớn cho cú pháp không đúng dễ dàng hơn một chút, trong số nửa tá những thứ nhỏ nhặt khác.
Eric Goldberg

12
Không chắc chắn chính xác kiến ​​trúc cảm xúc là gì. Bạn có thể cung cấp một ví dụ trong "ban ngày lạnh, sáng không?" ;-) false và NO là từ đồng nghĩa, nhưng chúng tôi sử dụng NO theo quy ước trong Objective-C. Có lý do để nhất quán; Không nhất quán là được, nhưng trách nhiệm chứng minh sự xứng đáng nằm ở người phá vỡ quy ước, chứ không phải người tuân theo quy ước đó.
Eric Goldberg

9
Với tất cả sự tôn trọng, @EricGoldberg có một quan điểm: quy ước là vấn đề. Và bởi vì bạn sẽ __strongở những nơi khác trong mã của mình (không có __retain), bạn có thể muốn chuyển sang sử dụng strongcho nhất quán. Điều này tương tự như việc thụt lề mã của bạn theo một cách nhất quán, mặc dù mã sẽ chạy tốt nếu không có điều này.
Dan Rosenstark

3
@matt: nếu bạn nhìn vào bình luận ban đầu của tôi, bình luận mà bạn buộc tội tôi viết mã "theo cảm xúc" (bất kể điều đó là gì), bạn sẽ thấy rằng tôi sử dụng các từ "posit" và "chỉ để mang tính ngôn ngữ." Trên thực tế, tôi đề nghị "nên" chứ không phải "là".
Eric Goldberg

1
TẤT CẢ LẬP TRÌNH là về thành ngữ. Không có vấn đề nào khác. Tất cả lập trình là một từ đồng nghĩa, toàn bộ thực hành kỹ thuật của lập trình là sử dụng thành ngữ hiện tại, để thêm giá trị vào mã cho máy khách.
Fattie

40

Để trả lời tất cả ba câu hỏi trong một: retainstrongđồng nghĩa với nhau, vì vậy cả hai đều đúng. Tài liệu nêu rõ

retainngụ ý __strongquyền sở hữu

strongngụ ý __strongquyền sở hữu


Cảm ơn vì sự trả lời. Tôi đã đọc tài liệu của Apple về ARC. Tôi hiểu rằng giữ lại dịch thành mạnh mẽ. Tuy nhiên, điều này không giải thích tại sao các mã được tạo tự động bởi Xcode khi tạo mới NSManagedObject (s) sẽ cung cấp cho bạn @property (nonatomic, giữ lại)
one09jason

3
Trừ khi tôi đang thiếu một cái gì đó ở đây, điều đó giải thích nó một cách hoàn hảo. Mã mà Xcode tạo là chính xác vì giữ lại hoạt động mạnh mẽ, vậy câu hỏi của bạn là ở đâu?
Phlibbo

6
Nếu bạn chạy cấu trúc lại ARC trên dự án của mình, nó sẽ chuyển đổi tất cả những thứ đó retainthành strongs. Vì vậy, ấn tượng của tôi là đó stronglà thuộc tính được ưa thích, nhưng trình tạo NSManagedObject chưa được cập nhật. Nhưng đó chỉ là phỏng đoán; Có lẽ không ai ở Apple coi sự khác biệt là quan trọng.
lý thuyết

4

Trước ARC, bạn phải 'giải phóng' một đối tượng được giữ lại. Điều đó có nghĩa là giữ lại có một phần truy cập. Sau ARC, bạn không cần phải phát hành. Vì vậy, hãy sử dụng mạnh mẽ. Đó là một manh mối trực quan mà bạn không cần phải gọi là phát hành.


3

"giữ lại" là tương đương với "mạnh mẽ".

"strong" được sử dụng cho ví dụ:

@property (nonatomic, strong) NSString * someString;

Và "__strong" được sử dụng cho ví dụ:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

Trên Apple Docs. nói:

Thuộc tính tài sản

Các từ khóa yếu và mạnh được giới thiệu dưới dạng các thuộc tính được khai báo mới, như được hiển thị trong các ví dụ sau.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Tài liệu Apple. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.