Trong ví dụ bên dưới, tôi không hiểu tại sao localVariable
đang được truy cập theo giá trị trong doSomethingWithObject
. Điều gì làm cho chuyển đổi đó? Làm thế nào để bạn phân biệt giữa việc truy cập một biến theo giá trị và truy cập nó theo tham chiếu? Tôi muốn xem thêm các ví dụ liên quan nếu có thể.Truy cập các biến theo giá trị hoặc tham chiếu
Sau đây là trích đoạn từ số Blocks Programming Topics của Apple và hiển thị cách các biến mẫu được giữ lại trong các khối.
Nếu bạn sử dụng một khối trong việc thực hiện của một phương pháp, các quy tắc cho quản lý bộ nhớ của đối tượng biến dụ là tinh tế hơn:
- Nếu bạn truy cập một biến Ví dụ tham khảo,
self
bị cản trở;- Nếu bạn truy cập một biến mẫu theo giá trị, biến đó sẽ được giữ lại.
Các ví dụ sau minh họa cho hai tình huống khác nhau:
dispatch_async(queue, ^{ // instanceVariable is used by reference, self is retained doSomethingWithObject(instanceVariable); }); id localVariable = instanceVariable; dispatch_async(queue, ^{ // localVariable is used by value, localVariable is retained (not self) doSomethingWithObject(localVariable); });
Không chắc tôi hoàn toàn hiểu điều này ... nhưng cảm ơn cho lời giải thích anyway. – Pablo
@Dave, không phải của tôi. Tuy nhiên, tôi không thể kết nối câu cuối cùng với phần còn lại của lời giải thích của bạn. "Cái đó" ám chỉ cái gì? Cũng không thể lấy phần bản sao. Từ những gì tôi có thể hiểu một cách đơn giản là nếu bạn có thể thay thế ngà bằng tự ngà, thì tự giữ lại, nếu không thì ngà sẽ được giữ lại. Nhưng cái gì là 'bởi giá trị',' bởi ref' vẫn không rõ ràng với tôi. Lấy làm tiếc. – Pablo
@Michael câu trả lời cập nhật –