क्या यह निर्दिष्ट करने का कोई तरीका है कि किसी विशेष विधि तर्क में कमजोर अर्थशास्त्र है?कमजोर विधि तर्क अर्थशास्त्र
- (void)runTest {
__block NSObject *object = [NSObject new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self myMethod:object];
});
// to make sure it happens after `myMethod:` call
dispatch_async(dispatch_get_main_queue(), ^{
object = nil;
});
}
- (void)myMethod:(__weak id)arg0 {
NSLog(@"%@", arg0); // <NSObject: 0x7fb0bdb1eaa0>
sleep(1);
NSLog(@"%@", arg0); // nil
}
यह स्विफ्ट संस्करण, कि नहीं करता है
public func runTest() {
var object: NSObject? = NSObject()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
self.myMethod(object)
}
dispatch_async(dispatch_get_main_queue()) {
object = nil
}
}
private func myMethod(arg0: AnyObject?) {
println("\(arg0)") //Optional(<NSObject: 0x7fc778f26cf0>)
sleep(1)
println("\(arg0)") //Optional(<NSObject: 0x7fc778f26cf0>)
}
मैं ym धारणा में सही हूँ है:
विस्तार से बता दें कि यह एक ऑब्जेक्टिव-सी नमूना कोड है कि उम्मीद के रूप में काम करता है स्विफ्ट संस्करण में विधि कॉल के बीच arg0 बनने के लिए कोई रास्ता नहीं है? धन्यवाद!
अद्यतन एप्पल Dev.Forums से किसी उपयोगकर्ता ने बताया कि sleep
प्रयोग करने में और लगातार डिस्पैच रेस स्थितियां कारण हो सकता है एक अच्छा काम नहीं है। हालांकि वे उचित चिंताओं हो सकते हैं, यह सिर्फ एक नमूना कोड है, सवाल का ध्यान कमजोर तर्कों को पारित करने पर है।
फिलहाल यह संभव नहीं है, आप इसे बंद करने की शुरुआत में '[कमजोर yourObject]' के साथ स्विफ्ट 2.0 से पहले कर सकते हैं। यह भी देखें [यहां] (http://stackoverflow.com/questions/24717460/cant-make-weak-reference-to-closure-in-swift) जहां वे कुछ वर्कअराउंड दिखाते हैं – Kametrixom
मैं समझता हूं कि कमजोर बंद होना समाधान हो सकता है लेकिन यह समस्या का समाधान नहीं करता है, मैं नहीं चाहता कि एपीआई के सभी उपभोक्ताओं को मेरे कार्यान्वयन विवरणों के बारे में पता होना चाहिए। क्या स्विफ्ट 2 में यह संभव है? –
उपभोक्ताओं को इस तरह के आपके एपीआई कार्यान्वयन के बारे में कैसे पता चलेगा? – Kametrixom