2015-12-31 12 views
5

मुझे पता है कि कई तरीके अपने सुपर वर्ग विधि कॉल करने की जरूरत है और कुछ तरीकों न की जरूरत है,करता विधि [लोड] [सुपर लोड]

मैं के बारे में विधि swizzling.It के दशक में प्रारंभ के बारे में sth देख रहा हूँ कॉल करने की आवश्यकता लोड विधि, और ट्यूटोरियल में [super load] नहीं है।

मुझे आश्चर्य है कि यह गलत है या [super load] पर कॉल करने की आवश्यकता नहीं है।

+ (void)load { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     Class class = [self class]; 

     // When swizzling a class method, use the following: 
     // Class class = object_getClass((id)self); 

     SEL originalSelector = @selector(pushViewController:animated:); 
     SEL swizzledSelector = @selector(flbs_pushViewController:animated:); 

     Method originalMethod = class_getInstanceMethod(class, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 

     BOOL didAddMethod = 
     class_addMethod(class, 
         originalSelector, 
         method_getImplementation(swizzledMethod), 
         method_getTypeEncoding(swizzledMethod)); 

     if (didAddMethod) { 
      class_replaceMethod(class, 
           swizzledSelector, 
           method_getImplementation(originalMethod), 
           method_getTypeEncoding(originalMethod)); 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod); 
     } 
    }); 
} 

#pragma mark - Method Swizzling 

- (void)flbs_pushViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self flbs_pushViewController:viewController animated:animated]; 
    }); 
    NSLog(@"flbs_pushViewController"); 
} 

वैसे, इस विधि का उपयोग नेविगेशन भ्रष्टाचार को ठीक करने के लिए किया जाता है।

मैं कभी-कभी समस्या को फिर से प्रकट करने के लिए हुआ, और मैंने इसे डीबगर्ज किया, मुझे लगता है कि यह थ्रेड के बारे में है। इसलिए मैं सिस्टम विधि में sth जोड़ने के लिए यह swizzling बनाते हैं।

यदि आप नेविगेशन भ्रष्टाचार की समस्या या इस विधि को तेज करने के बारे में बता सकते हैं, तो मैं भी इसकी सराहना करता हूं।

+0

[सुपर लोड] को कॉल करने का सर्वोत्तम अभ्यास इसलिए सभी घटकों को घटना होने का संचार मिलता है। – nikhil84

उत्तर

6

NSObject documentation से (जोर जोड़ा):

एक वर्ग के +load विधि कहा जाता है के बाद अपने सुपर-क्लास '+load पद्धतियों का अनुपालन।

जिसका अर्थ है कि आपको अपने कोड से [super load] पर कॉल करने की आवश्यकता नहीं है। load सभी सुपरक्लासों से विधि को को ऑब्जेक्टिव-सी रनटाइम द्वारा से पहले आपके सबक्लास में विधि कहा जाता है।

+0

कृपया मुझे बताएं * इस उत्तर में क्या * गलत है। –

+0

मुझे लगता है कि जवाब बिल्कुल सही है .... –

+1

... तो, यदि आप '[सुपर लोड]' कहते हैं, तो सुपरक्लास 'कार्यान्वयन _twice_ चलाएगा! –

संबंधित मुद्दे