2011-07-26 17 views
6

Một người bạn đã nói với tôi rằng mặc định @property cho các thuộc tính vô hướng (BOOL, NSInteger, v.v.) là không nguyên tử. Ví dụ:Mục tiêu-C: Mặc định là nguyên tử cho các thuộc tính vô hướng?

@property BOOL followVenmo; 

mặc định là

@property (nonatomic) BOOL followVenmo; 

Nhưng, tôi đã luôn luôn theo ấn tượng rằng mặc định luôn là nguyên tử, vô hướng hay không.

Đó là gì?

Trả lời

0

Dựa trên nghiên cứu của tôi về một vài câu hỏi liên quan khác:

tôi phải tuân theo @Rhubarb's recommendation:

Như một quy tắc của ngón tay cái, nếu bạn không cần hỗ trợ đa luồng - thông thường bạn không biết nếu bạn làm việc trong mã UI như UIViewControllers, sau đó chỉ cần khai báo tất cả các nonatomic.

10

Hãy cẩn thận với thuật ngữ "vô hướng" này. Thuộc tính NSString * cũng là một con trỏ, giống như ví dụ bạn đã cung cấp với một con trỏ tới BOOL.

Từ docs Apple: (The Objective-C Programming Language)

Nếu bạn chỉ định retain hoặc copy và không chỉ định nonatomic, sau đó trong một môi trường tham khảo-tính, một tổng hợp lấy accessor cho một thuộc tính đối tượng sử dụng một khóa giữ lại và tự động trả lại giá trị trả về —giấy lementation sẽ tương tự như sau:

[_internal lock]; // lock using anobject-levellock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Bạn không thể áp dụng một khóa đối tượng cấp ở cái gì đó không phải là một đối tượng, vì vậy (không) nguyên tử trong thuộc tính của các loại nguyên thủy về cơ bản không có hiệu lực.

Bạn có thể kết luận rằng nguyên tử chỉ áp dụng cho đối tượng tài sản, và điều này được củng cố trong các tài liệu:

Nếu bạn chỉ định nonatomic, một accessor tổng hợp cho một tài sản đối tượng chỉ đơn giản trả về giá trị trực tiếp.

Để làm rõ xem bạn có nên chỉ định một hay khác: về mặt kỹ thuật, tài sản mà không có một nonatomic được coi nguyên tử, nhưng hãy nhớ rằng nó không có ý nghĩa với nhiều loại nguyên thủy. Vì vậy, bạn có thể muốn tiết kiệm một số đánh máy và tránh nonatomic trong những điều này.

+0

Rất tiếc. Tôi có nghĩa là để làm cho những giá trị BOOL, không phải con trỏ. Đang cập nhật ... – ma11hew28

+0

Tôi vẫn chưa rõ một chút. Vì vậy, tôi không nên chỉ định 'nonatomic' cho các kiểu nguyên thủy? – ma11hew28

+0

Bạn thực sự không cần phải có bất kỳ thuộc tính nào cho các kiểu nguyên thủy. Điều anh ấy nói là bạn chỉ yêu cầu nonatomic cho các đối tượng, không phải các kiểu nguyên thủy. Vì vậy, @property BOOL someBool; hoạt động tốt. –

-1

Từ Developer Documentation

nonatomic các định rằng accessors là nonatomic. Theo mặc định, người truy cập là nguyên tử.

Thuộc tính nguyên tử đảm bảo rằng bạn sẽ nhận được hoặc đặt toàn bộ giá trị. Ví dụ, thiết lập một CGRect từ 2 chủ đề sẽ kết thúc với một hoặc khác, không phải một số sự kết hợp của hai.

Đối với các thuộc tính được giữ lại, nó cũng đảm bảo rằng kết quả có thể sống lâu hơn người nhận. Ví dụ: bạn nhận được kết quả từ một đối tượng được phát hành bởi một chuỗi khác trước khi cuộc gọi kết thúc, nhưng kết quả được giữ lại và tự động thay mặt bạn để nó vẫn hợp lệ.

+1

Bạn thậm chí đã đọc câu hỏi chưa? – ma11hew28

+1

Bạn đã đọc tài liệu chưa? Câu trả lời là trong câu trích dẫn từ tài liệu - tất cả những người truy cập đều là nguyên tử bất kể tài sản là nguyên thủy hay không. – drawnonward