2011-01-11 13 views
21

Tôi đã đọc nội dung nào đó ở một số mã nước ngoài và tôi muốn kiểm tra giả định của mình:@synchronized (self) có tạo một khối nơi tiền tố tự không cần thiết trên các thuộc tính không?

@synchronized(self) được sử dụng để loại bỏ tiền tố self khi đặt thuộc tính.

Vì vậy, trong ví dụ dưới đây, tôi đang đặt strText của cá thể, không chỉ là biến cục bộ, phải không?

- (void)myfunction{ 
    NSString * strText = @"var in function"; 
    @synchronized(self) 
    { 
     strText = @"var class (self.strText)"; 
    } 

} 

Trả lời

39

Xin vui lòng đọc này Documentation

Chỉ thị @synchronized() khóa một phần của mã để sử dụng bởi một sợi đơn . Các chủ đề khác bị chặn cho đến khi luồng thoát khỏi mã được bảo vệ — tức là khi thực thi tiếp tục qua câu lệnh cuối cùng trong khối @synchronized().

Chỉ thị @synchronized() lấy làm đối số duy nhất bất kỳ đối tượng Mục tiêu-C, bao gồm self.

Như Massimo Cafaro pointed out: "Đó là an toàn nhất để tạo ra tất cả các đối tượng loại trừ lẫn nhau trước khi ứng dụng trở nên đa luồng, để tránh điều kiện chủng tộc"

+2

Liên kết tài liệu hiện đã lỗi thời. Vui lòng tham khảo trang này: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – cescofry

+0

@cescofry, Có liên kết đã lỗi thời. Tôi cập nhật câu trả lời của tôi với liên kết đã cho. Cảm ơn. – Tirth

8

@synchronized (self) được sử dụng để loại bỏ tự. tiếp đầu ngữ.

Vì vậy, trong ví dụ của tôi, tôi đặt strText không có trong hàm tôi đặt trong lớp .

Hai khái niệm đang được sắp xếp.

  1. @synchronized(self) { ... } chỉ khóa khối bằng đối tượng self làm semaphore.
  2. Trong mục tiêu-C, không có gì giống như một tuyên bố with giả định như trong các ngôn ngữ khác loại bỏ sự cần thiết cho self.whatever chỉ là whatever. Có thể muốn tham gia khóa học trực tuyến Stanford CS193P để cập nhật ngôn ngữ.
+7

Tại sao lại là câu trả lời này? Nó có thể 'trả lời' câu hỏi đó - nhưng không có hành vi phạm tội - bạn chỉ tình cờ gặp và vô ích. –

+5

@synchronized không ảnh hưởng đến việc bạn có cần "tự" hay không. tiếp đầu ngữ. Chúng không liên quan theo bất kỳ cách nào. –

+2

Đây là câu trả lời duy nhất trong ba câu hỏi thực sự giải quyết sự hiểu lầm trong câu hỏi @Matt. Hai người kia chỉ vẹt các tài liệu về '@synchronized()' –