2012-12-21 24 views
9
@interface SomeClass : NSObject 

@property (copy, nonatomic) NSString *usefulString; 
@property (strong, nonatomic) NSString *dangerousString; 

@property (copy, nonatomic) NSURL *curiousURLOne; 
@property (strong, nonatomic) NSURL *curiousURLTwo; 

@end 

उपरोक्त वर्ग में, dangerousString को एक बुरा विचार माना जाता है क्योंकि NSMutableStringNSString से विरासत में है। मतलब यह संभव है कि आपकी कक्षा का उपयोगकर्ता एक म्यूटेबल स्ट्रिंग को dangerousString पर सेट कर सके, और उसके बाद SomeClass के उदाहरण के नीचे से म्यूटेबल स्ट्रिंग के मान को बदल दें। संपत्ति usefulString में यह खतरा नहीं है क्योंकि यह मान को एक नए (अपरिवर्तनीय) स्ट्रिंग ऑब्जेक्ट में प्रतिलिपि बनाता है।NSURL - कोई म्यूटेबल सबक्लास नहीं, इसलिए किसी संपत्ति के रूप में "प्रतिलिपि" करने की आवश्यकता नहीं है?

हालांकि, यह NSURL के लिए की तरह लगता है (और किसी भी अन्य आधार वर्गों परिवर्तनशील समकक्षों की जरूरत नहीं है कि - जैसे NSNumber) प्रतिलिपि संपत्ति घोषणा के अर्थ अनावश्यक है। NSURL NSCopying के copyWithZone:का पालन करती है (... लेकिन मुझे आश्चर्य है कि अगर यह सिर्फ एक वृद्धि को बनाए रखने गिनती के साथ एक ही वस्तु वापस नहीं करता है - कारण है कि यह कुछ और करना होगा)

तुम क्यों गुण घोषणा करेंगे copy के रूप में जो उत्परिवर्तित होने का खतरा नहीं है?

उत्तर

6

तथ्य यह है कि ऐप्पल एक उत्परिवर्तनीय सबक्लास की आपूर्ति नहीं करता है इसका मतलब यह नहीं है कि एक दुर्भावनापूर्ण उपयोगकर्ता आपकी कक्षा को चालित करने के लिए विशेष रूप से एक निर्माण नहीं कर सका। एक प्रोग्रामर आप देता है

@interface TrickThemURL : NSURL 
    // override key properties, such as baseURL and host, to be mutable 
@end 

: यदि आप इस धारणा है कि तार अपने वर्ग के पीछे बदला जा सकता है के तहत काम करते हैं, तो आप कम से कम एक बीमार इरादे उपयोगकर्ता एक परिवर्तनशील वर्ग में NSURL विस्तार की संभावना के लिए अनुमति देने के लिए की जरूरत है TrickThemURL का ऑब्जेक्ट और आप सत्यापन से पहले इसे कॉपी करने में विफल रहते हैं, कि प्रोग्रामर अब आपकी कक्षा को बताए बिना यूआरएल को बदलने के लिए स्वतंत्र है।

+2

TrickThemURL सिर्फ -copy पर हावी नहीं होगा अगर यह दुर्भावनापूर्ण बनना चाहता था? – Darren

+0

@ डैरेन मुझे लगता है कि आप सही हैं - सुरक्षित होने का एक तरीका '[NSURL urlWithString: urlArg.standardizedURL]' का उपयोग करना है और फिर परिणाम को सत्यापित करना है। – dasblinkenlight

+0

इस चर्चा के आधार पर ऐसा लगता है कि 'मजबूत' "सुरक्षित" है। यह एक बिल्ली और माउस गेम के लिए एक अवसर खोलता है, लेकिन यह ठीक हो सकता है जब तक कि इस वर्ग की उपयोगिता एक ही आवेदन की सीमा से परे बढ़ जाती है। – edelaney05

9

iOS7 आप NSURLComponents उपयोग कर सकते हैं के साथ, अब यह बहुत ही सरल, देखने के लिए है इस उदाहरण:

NSString *urlString = @"https://mail.google.com/mail/u/0/?shva=1#inbox"; 
NSURLComponents *components = [[NSURLComponents alloc] initWithString:urlString]; 

NSLog(@"%@ - %@ - %@ - %@", components.scheme, components.host, components.query, components.fragment); 



NSURLComponents *components = [NSURLComponents new]; 
[components setScheme:@"https"]; 
[components setHost:@"mail.google.com"]; 
[components setQuery:@"shva=1"]; 
[components setFragment:@"inbox"]; 
[components setPath:@"/mail/u/0/"]; 

[webview loadRequest:[[NSURLRequest alloc] initWithURL:[components URL]]]; 
+0

मुझे यकीन है कि उपरोक्त प्रश्न के साथ इसे क्या करना है? ऐसा लगता है कि आप बस दिखा रहे हैं कि NSURLComponents का उपयोग करके URL कैसे बनाएं। – codecaffeine

+0

हां, लेकिन सवाल यह नहीं पूछ रहा था कि यूआरएल के एक हिस्से को कैसे बदला जाए, यह पूछ रहा था कि 'NSURL' संपत्ति को 'प्रतिलिपि' के रूप में सेट करना आवश्यक है क्योंकि यह अपरिवर्तनीय है। – codecaffeine