2011-09-16 28 views
5

AFAIK, __block được sử dụng khi bạn thay đổi, bên trong khối, địa chỉ mà một biến (được khai báo bên ngoài khối) trỏ đến.ARC có cho tôi biết khi nào tôi phải sử dụng __block không?

Nhưng, điều gì xảy ra nếu tôi thay đổi giá trị mà biến trỏ đến nhưng con trỏ vẫn giữ nguyên? Ví dụ: nếu tôi có NSMutableArray *array và tôi chỉ đang làm [array addObject:object] bên trong khối? Trong trường hợp này, tôi không thay đổi con trỏ array, nhưng tôi đang thay đổi giá trị mà nó trỏ đến. Vì vậy, tôi vẫn phải sử dụng __block khi khai báo NSMutableArray *array?

Trả lời

19

Bạn chỉ cần __block nếu bạn thay đổi giá trị của biến.

I.e. nếu bạn có:

NSArray* foo; 

Bạn chỉ cần __block nếu bạn thay đổi giá trị foo. Bây giờ, hãy nhớ rằng foo không là gì hơn "một con trỏ tới một thứ được nhập NSArray". I E. foo có hiệu quả là số nguyên 64 bit hoặc 32 bit, tùy thuộc vào nền tảng. Nếu bạn thay đổi số nguyên đó, bạn cần __block. Nếu không, bạn không cần __block.

Vì vậy, không, bạn không cần __block để gọi addObject: trên mảng vì bạn không thực sự thay đổi giá trị foo.

Nếu bạn đã làm điều gì đó như foo = (expression);, thì bạn cần __block.

(lưu ý rằng đây là một trong những lý do tại sao lập trình đồng thời dưới OO như vậy damned cứng ... nó là đặc biệt khó khăn để xác định "miền phương sai" cho bất kỳ con đường thực hiện được)

+0

gì về trình biên dịch tối ưu hóa ? '__block' có thể gợi ý rằng một đối tượng không bao giờ thay đổi, và nếu' NSArray' được inlined, các lời gọi tiếp theo tới dung lượng có thể sai. – Dani

+2

'__block' cho biết biến có thể thay đổi. Có hay không biến là '__block' hoặc const-copy (như mặc định), gọi phương thức trên đối tượng sẽ không bị ảnh hưởng. – bbum

+0

Nhưng điều gì xảy ra nếu biến (NSArray *) là một thuộc tính tự? __block có cần phải được thêm vào không? – Amnysia

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