2013-08-30 16 views
15
@interface PaneBean : NSObject 

@property(nonatomic,copy) NSString *name; 
@property(nonatomic,copy) NSString *type; 
@property(nonatomic,assign) NSInteger width; 
@end 

Tôi có PaneBean như được hiển thị ở trên.Cho dù tôi nên sử dụng @property (nonatomic, copy) hoặc @property (nonatomic, strong) cho attst (NSString *) của tôi trong một đối tượng?

Tôi có nên sử dụng @property(nonatomic,copy) hoặc @property(nonatomic,strong) cho số (NSString *) name của mình không? sự khác biệt giữa chúng là gì?

Và có quyền viết 'gán' cho NSInteger không?

Bất kỳ trợ giúp nào được đánh giá cao.Cảm ơn trước!

+6

Không liên quan đến câu trả lời, bạn có thể muốn xem xét việc học các quy ước đặt tên và thiết kế ca cao. "Bean" là một thuật ngữ Java rất nhiều, và các lập trình viên Cocoa mà bạn có thể làm việc với không có khả năng hiểu được nó. –

+0

oh, vâng, tôi sẽ chỉnh sửa nó. – kongkong

+0

@Catfish_Man điều này đã có được đầu ra từ Java để ObjC dịch, "CocoaBeans";) – justin

Trả lời

15

'copy' sẽ gây ra setter cho thuộc tính đó để tạo bản sao của đối tượng và là nếu không giống với mạnh mẽ. Bạn sẽ sử dụng điều này để đảm bảo rằng nếu ai đó đặt thuộc tính của bạn thành chuỗi có thể thay đổi, sau đó tắt chuỗi, bạn vẫn có giá trị ban đầu. Nếu chuỗi không thể thay đổi, Cocoa sẽ âm thầm tối ưu hóa hoạt động sao chép, tốt đẹp :)

'strong' sẽ giữ giá trị của thuộc tính còn sống cho đến khi nó được đặt thành thứ khác. Nếu bạn muốn chuỗi có thể thay đổi đến để thay đổi từ bên dưới bạn (không phải không thể, nhưng không phải tất cả những gì phổ biến, một điều cần), thì mạnh mẽ sẽ là điều đúng để làm. Nói chung mạnh mẽ là hữu ích hơn cho các đối tượng đại diện cho một cái gì đó phức tạp hơn một giá trị "đơn giản" (tức là không NSString, NSNumber, NSValue, vv ...).

'chỉ định' là cài đặt có thể mặc định (và thực sự chỉ) cho một số nguyên. Số nguyên không thể được giữ lại hoặc sao chép như đối tượng.

+0

Vì gán là chỉ có thể thiết lập cho các giá trị scaler bạn không bao giờ nên xác định rõ ràng nó. Apple nói điều này nhiều lần trong tài liệu. Tôi đã thấy những người lập trình có kinh nghiệm mắc lỗi này. – smileBot

7

Đối với thuộc tính có loại là lớp giá trị không thay đổi phù hợp với giao thức bản sao của NSC, bạn hầu như luôn luôn chỉ định sao chép trong khai báo @property của mình. Quy định cụ thể giữ lại một cái gì đó là bạn gần như không bao giờ muốn ở một situation.In phi ARC ví dụ mạnh mẽ sẽ làm việc như giữ

Dưới đây là lý do tại sao bạn muốn làm điều đó:

NSMutableString *someName = [NSMutableString stringWithString:@"Chris"]; 
Person *p = [[[Person alloc] init] autorelease]; 
p.name = someName; 
[someName setString:@"Debajit"]; 

Giá trị hiện tại của tài sản Person.name sẽ được khác nhau tùy thuộc vào việc tài sản được khai báo giữ lại hoặc sao chép - nó sẽ được @ "Debajit" nếu tài sản được đánh dấu giữ lại, nhưng @ "Chris" nếu tài sản được đánh dấu sao chép.

Vì trong hầu hết các trường hợp bạn muốn ngăn chặn đột biến thuộc tính của đối tượng sau lưng, bạn nên đánh dấu các thuộc tính thể hiện chúng sao chép. (Và nếu bạn tự viết bản thay vì sử dụng @synthesize, bạn nên nhớ sử dụng bản sao thay vì giữ lại trong đó.)

1

Biểu thị mạnh cho biết thành phần, trong khi Yếu chỉ ra tổng hợp.

Sao chép có nghĩa là một đối tượng mới sẽ được tạo trước khi nội dung của đối tượng cũ được sao chép vào đối tượng mới. Đối tượng sở hữu, PaneBean trong trường hợp này, sẽ bao gồm đối tượng mới được tạo ra.

2

copy gửi thông báo copy đối tượng bạn đã đặt, trong khi strong chỉ giữ lại đối tượng đó (tăng số lượng tham chiếu).

Đối NSString, hay nói chung bất kỳ lớp inmutable với lớp con biết có thể thay đổi (NSArray, NSDictionaty, NSSet), bản sao được preffered để tránh khách hàng thiết lập một trường hợp có thể thay đổi và sửa đổi nó ra khỏi đối tượng.

Đối với các loại nguyên thủy (ví dụ int) sao chép/mạnh mẽ không có ý nghĩa và theo mặc định gán được sử dụng. Là tùy thuộc vào bạn nếu bạn muốn đặt nó một cách rõ ràng hay không.

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