Tôi đã đến C++ 11 từ một nền Objective-C, và một điều tôi đang gặp khó khăn để đến với các điều khoản khác nhau là ngữ nghĩa bắt giữ của C++ 11 lambdas vs Objective-C "khối". (Xem here để so sánh).Sử dụng C++ 11 lambdas không đồng bộ, an toàn
Trong mục tiêu-C, như C++, con trỏ self
/this
bị ẩn hoàn toàn nếu bạn tham chiếu đến biến thành viên. Nhưng bởi vì tất cả các đối tượng trong Objective-C là một cách hiệu quả "con trỏ được chia sẻ", sử dụng thuật ngữ C++, bạn có thể làm điều này:
doSomethingAsynchronously(^{
someMember_ = 42;
});
... và bạn chắc chắn rằng đối tượng có thành viên mà bạn đang truy cập sẽ còn sống khi khối thực hiện. Bạn không cần phải suy nghĩ về nó. Tương đương trong C++ có vẻ giống như:
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
Ở đây, bạn cần phải nhớ chụp shared_ptr ngoài con trỏ này. Có một số cách ít dễ bị lỗi hơn để đạt được điều này?
* "Bạn không cần phải suy nghĩ về nó." * Bắt đầu suy nghĩ về nó. Nó dẫn đến thiết kế tốt hơn. – Pubby
@Pubby Nhưng vấn đề là, đó là nỗ lực của việc sử dụng các khối làm cho chúng trở nên hữu ích và phổ biến cho các tác vụ không đồng bộ một-shot trong thế giới Obj-C. Nếu họ có ngữ nghĩa C++ 11, và bạn phải tự hỏi mình "liệu vật thể này có còn sống không, vật thể này sẽ còn sống, vật thể này sẽ còn sống ..." mỗi lần, tôi nghĩ nhiều người sẽ bị cám dỗ nói "vít nó, tôi sẽ làm nó một cách đồng bộ." –
Tạo một con trỏ được chia sẻ từ 'this' không đảm bảo nó sẽ vẫn tồn tại, trừ khi chính đối tượng đã được sở hữu bởi một con trỏ được chia sẻ và bạn đang sao chép nó. Tạo một con trỏ được chia sẻ mới (bởi 'shared_ptr mới (this)' hoặc 'make_shared (this)') sẽ chỉ phục vụ để có được một double-delete, trừ khi bộ nhớ sẽ bị rò rỉ nếu không. Vì vậy, trong trường hợp của bạn, làm thế nào để 'này' bị xóa nếu bạn không tạo một con trỏ chia sẻ tại thời điểm này? –
Agentlien