2012-06-19 9 views
5

मैं निम्न नमूना कोड लिखा कैसे एआरसीआईओएस में कमजोर एनएसएसटींग गुण क्यों जारी नहीं किए जाते हैं?

@property (nonatomic, weak) NSString *myString; 
@property (nonatomic, weak) NSObject *myObj; 
@end 

@implementation ViewController 
@synthesize myString = _myString; 
@synthesize myObj = _myObj; 
- (void) viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"Appearing Obj: !%@!",self.myObj); 
    NSLog(@"Appearing String: !%@!",self.myString); 
} 

- (void)viewDidLoad 
{ 
    self.myObj = [[NSObject alloc] init]; 
    self.myString = [[NSString alloc] init]; 
    NSLog(@"Loading Obj %@",self.myObj); 
    NSLog(@"Loading String: !%@!",self.myString); 
} 

हालांकि आश्चर्यजनक रूप से मैं इन परिणामों मिला कारगर सिद्ध होगा:

2012-06-19 15:08:22.516 TESTER[4041:f803] Loading Obj (null) 
2012-06-19 15:08:22.517 TESTER[4041:f803] Loading String: !! 
2012-06-19 15:08:22.533 TESTER[4041:f803] Appearing Obj: !(null)! 
2012-06-19 15:08:22.535 TESTER[4041:f803] Appearing String: !! 

आप देख सकते हैं, Obj ठीक से जारी किया गया, लेकिन मेरी स्ट्रिंग (जो भी है एक कमजोर संपत्ति) शून्य से प्रिंट नहीं करता है ... क्यों नहीं?

+0

क्या स्ट्रिंग जिसे आप 'myString' में सेट कर रहे हैं, किसी भी स्ट्रिंग शाब्दिक (कुछ @ हैलो वर्ल्ड! ") से बदलते हैं? –

उत्तर

12

NSString वस्तुओं का पुन: उपयोग करने और अनावश्यक आवंटन और प्रतियों से बचने के लिए सभी प्रकार की आंतरिक चालबाजी का उपयोग करता है। ऐसा इसलिए हो सकता है क्योंकि NSString उदाहरण अपरिवर्तनीय हैं। इस मामले में शायद एक खाली स्ट्रिंग का प्रतिनिधित्व करने के लिए एक साझा उदाहरण है जिसे [[NSString alloc] init] द्वारा वापस किया जा रहा है, और यह साझा उदाहरण कहीं और एक सिंगलटन के रूप में बनाए रखा जाएगा।

+0

ऐसा लगता है कि यह समझ में आता है। धन्यवाद! – Nosrettap

+0

शायद कोई इसकी पुष्टि करने के लिए एनएसएसटींग स्रोत कोड देख सकता है। –

+0

समझ में आता है, हालांकि मुझे नहीं लगता कि इस व्यवहार पर भरोसा करना बुद्धिमान होगा, जो कि कुछ अनुकूलन का एक अभिव्यक्ति है, जो किसी भविष्य की तारीख में बदलाव के अधीन है। – Rob

6

[[NSString alloc] init] हमेशा समान मान देता है। आप इसे अपने आप देख सकते हैं।

NSString *string1 = [[NSString alloc] init]; 
NSString *string2 = [[NSString alloc] init]; 
NSString *string3 = [[NSString alloc] init]; 
NSLog(@"string1 = %p, string2 = %p, string3 = %p", string1, string2, string3) 

यह कोड तीन समान पते देता है। मेरे मामले में, उत्पादन किया गया था:

string1 = 0x3e8dd74c, string2 = 0x3e8dd74c, string3 = 0x3e8dd74c 

[[NSString alloc] init] रिटर्न सिंगलटन इसका मतलब है कि। सिंगलेट्स आमतौर पर जारी नहीं किया जा सकता है। अन्य तरीकों के साथ

बनाना तार (जैसे initWithFormat:) हमेशा की तरह 'गैर सिंगलटन' वस्तुओं, जो आमतौर पर जारी किया जा सकता, कुछ अपवादों में बनाता है।

आगे: खोज रहे हैं स्रोत कोड (असेंबलर):

-[NSPlaceholderString init]: 
00040ea4  f64b009c  movw r0, 0xb89c 
00040ea8  f2c00016  movt r0, 0x16 
00040eac   4478  add  r0, pc 
00040eae   4770  bx  lr 

यह कुछ इस तरह (objectivec में)

-(id)init 
{ 
    return SOME_CONSTANT_VALUE; 
} 

यह kCFEmptyString हो सकता है हो सकता है, लेकिन मैं नहीं कर रहा हूँ ज़रूर।

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