2012-01-13 30 views
6

Tôi hiểu rằng bạn phải sao chép các khối để chúng có thể di chuyển xung quanh sau khi thoát khỏi khung ngăn xếp. Nhưng, làm thế nào để áp dụng cho ngăn xếp phân bổ khối sử dụng trong vòng một khối lồng nhau như trong ví dụ mã sau:Tôi có phải sao chép một khối ở đây không?

- doSomethingFunkyThenCall:(void(^)(int someValue))callback 
{ 
    [[NSOperationQueue currentQueue] addOperationWithBlock:^{ 
     // ... do some work here, potentially nesting into further blocks ... 
     callback(result); 
    }]; 
} 

Rõ ràng, khung doSomethingFunkyThenCall: chồng sẽ chấm dứt trước khi gọi lại được thực thi, vì vậy nó sẽ phải đã sao chép. Nhưng điều này có xảy ra tự động trong cuộc gọi tới addOperationWithBlock: hoặc tôi có phải thực hiện thủ công không?

Trả lời

0

Có, bạn nên thực hiện callback = [[callback copy] autorelease]; ở đầu phương pháp này.

Đối tượng được sử dụng trong khối được giữ lại tự động, nhưng việc gửi một ngăn xếp ngăn xếp khối thực sự không có gì (vì ngữ nghĩa giữ lại yêu cầu trả lại bộ thu), vì vậy sẽ biến mất khi chúng tôi thoát khỏi khung được tạo.

Nguồn:
http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html http://thirdcog.eu/pwcblocks/#objcblocks

EDIT: hóa ra tôi sai. @bbum chỉ ra dưới đây rằng Block_copy sẽ sao chép đệ quy, và kể từ khi addOperationWithBlock: sao chép khối của nó, cuộc gọi lại cũng được sao chép.

+9

Không; không cần phải sao chép khối trong trường hợp này. Khi khối enqueued với 'addOperationWithBlock:' được sao chép (mà 'NSOperationQueue' sẽ làm), nó sẽ sao chép khối đóng gói. – bbum

+0

Cảm ơn. Bạn đúng. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1 – joerick

+0

Cảm ơn bbum và joerick! Tôi đã không nhìn thấy đoạn này từ liên kết đó trước đây: "Khi bạn sao chép một khối, mọi tham chiếu đến các khối khác trong khối đó sẽ được sao chép nếu cần thiết - toàn bộ cây có thể được sao chép (từ trên cùng). và bạn tham chiếu một khối từ bên trong khối, khối đó sẽ được sao chép. " –

3

Rất có thể, điều đó sẽ tự động diễn ra. Nguyên tắc thiết kế của Cocoa nói chung rằng bạn không chịu trách nhiệm đối với các đối tượng (quản lý bộ nhớ của họ, các khối truyền qua [thực tế, được thực hiện như các đối tượng Objective-C phù hợp], v.v.) mà bạn chưa tạo ra. Vì vậy, bạn chỉ có thể vượt qua khối bạn nhận được như một tham số, và thời gian chạy sẽ quản lý nó theo nhu cầu của nó.

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