2016-09-01 12 views
7

उपवर्गीकरण मैं MyClassA किस प्रकार MyClassBफॉरवर्ड घोषणा #import बनाम जब

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) MyClassB *myClassB; 

@end 

MyClassB एक संपत्ति myString है की एक संपत्ति है की है।

// 
// MyClassB.h 
// 

@interface MyClassB : NSObject 

@property (copy, nonatomic, readonly) NSString *myString; 

@end 

मैं MyClassC जो myString तक पहुँचने के लिए यह कार्यान्वयन है में की जरूरत है।

मैं चाहिए -

क) फॉरवर्ड MyClassA.h में MyClassB और #import "MyClassB.h"MyClassC.m

या

ख) #import MyClassB.h में MyClassA.h

उत्तर

2

सामान्य में में घोषित, आप के साथ की घोषणा अग्रेषित की जानी चाहिए @class जहां आपकी शीर्षलेख फ़ाइलों में संभव हो। एकमात्र ऐसा समय जब आप शायद ऐसा नहीं करना चाहते हैं, तब आप एक सुपर क्लास से विरासत में हैं या प्रोटोकॉल अनुरूपता घोषित कर रहे हैं, क्योंकि संकलक को यह पता होना चाहिए कि उस वर्ग या प्रोटोकॉल में क्या हो रहा है।

इस उदाहरण के लिए, मैं आपकी हेडर फ़ाइलों में आपकी सभी संपत्ति घोषणाओं के लिए @class का उपयोग करूंगा, और #import MyClassB.h आपकी MyClassC.m फ़ाइल में उपयोग करूंगा। इससे MyClassC को MyClassB पर सभी गुणों के बारे में पता चल जाएगा।

2

इसे थोड़ा अलग कोण से देख रहे हैं ... आपको यह तय करने की ज़रूरत है कि क्या आप myClassBMyClassA की संपत्ति होने के बारे में वास्तव में जानना चाहते हैं। उदाहरण के लिए, यदि आप केवल myString का विज्ञापन करना चाहते हैं जिसे MyClassA के माध्यम से प्राप्त किया जा सकता है। यह myString के अंतर्निहित कार्यान्वयन को जानने से अन्य वर्गों को इन्सुलेट करता है। जब तक आपको MyClassB का पर्दाफाश करने की आवश्यकता न हो, आपको इसे "शेष दुनिया" से छिपाना चाहिए।

इस मामले आप MyClassA.h बदल जाएगा इस प्रकार है:

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) NSString *myString; 

@end 

MyClassA.m में, आप निम्नलिखित करना होगा।

// 
// MyClassA.m 
// 

#import "MyClassA.h" 
#import "MyClassB.h" 

@interface MyClassA() 

@property (strong, nonatomic) MyClassB *myClassB;; 

@end 

@implementation MyClassA 

// Other meaningful code omitted 

- (NSString *)myString { 
    return self.myClassB.myString; 
} 

@end 

ध्यान दें कि क्या मैं यहाँ किया है एक गुमनाम श्रेणी का उपयोग करने के लिए आंतरिक रूप myClassB के लिए संपत्ति को परिभाषित है।

यहां महत्वपूर्ण बात यह है कि MyClassB दूसरों को बेनकाब नहीं करना है या नहीं। इस दृष्टिकोण का मुख्य लाभ यह है कि आपका कोड अधिक लचीला है। मान लें कि myString एक अलग तरीका प्राप्त हुआ है। एक अलग वर्ग या अलग विधि से पूरी तरह से। कोड जो myString उपभोग करने की आवश्यकता है, टीकाकरण किया जाता है।

आप MyClassB का पर्दाफाश करने की जरूरत है, तो आप @class उपयोग कर सकते हैं, जैसा कि ऊपर या #import MyClassB.h MyClassA.h से टायलर द्वारा सिफारिश की। सर्वोत्तम अभ्यास @class घोषित करने के लिए आगे निर्धारित करते हैं। लेकिन कभी-कभी कार्यान्वयन फ़ाइल के भीतर कई फाइलों को आयात करने की याद रखने की सुविधा जीत नहीं सकती है। यह आपका कोड-बेस है, इसलिए आप चुन सकते हैं कि कौन सा आपके लिए सबसे अच्छा काम करता है। मैं आम तौर पर दोनों के संयोजन का उपयोग करता हूं।

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