2009-04-04 10 views
5

मेरे पास एक ऐसी संपत्ति है जो अमान्य में बदलती है क्योंकि मैं viewDidLoad और viewWillAppear के बीच स्थानांतरित करता हूं। मुझे नहीं पता कि ऐसा क्यों होता है।एनएसएसटींग संपत्ति अवैध मूल्य में क्यों बदलती है?

मेरे पास एक सहायक वर्ग है जो मेरे डेटाबेस का मार्ग प्राप्त करता है। मैं इस वर्ग को ऐप प्रतिनिधि में आवंटित करता हूं। RootViewController इस तरह AppDelegate के लिए एक संदर्भ हो जाता है:

NSPathStore2 * appDelegate.databaseHeper.databasePath "/Users/userA/Library/Application Support/iPhone Simulator/User/Applications..." 

DatabasePath एक NSString घोषित किया जाता है:

//inside .h file 
@interface RootViewController : UITableViewController 
<UITableViewDelegate, UITableViewDataSource>{ 
NSArray *controllers; 
myAppDelegate *appDelegate; 
} 

//inside .m file 
@implementation RootViewController 
@synthesize controllers; 

- (void)viewDidLoad { 
appDelegate = [[UIApplication sharedApplication] delegate]; 

self.controllers = appDelegate.topicControllers; 
[super viewDidLoad]; 
} 

मैं AppDelegate पर माउस डेटाबेस सहायक वर्ग और संपत्ति डेटाबेस पथ युक्त खोजने के लिए। यह एनएसपीएथस्टोर 2 में क्यों बदल गया है?

जैसा कि मैं डीबगर में जारी रहता हूं, कुछ और अजीब बात होती है। एक बार जब मैं देखता हूं WillAppear, संपत्ति मान "अमान्य" हो जाता है और प्रकार एनएसएसटींग पर वापस आ जाता है। Althought मैंने वहाँ यूआईबटन भी देखा है।

यह अवैध क्यों बदलता है? अब मैं चर का उपयोग नहीं कर सकता।

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; //changes before this line executes 
} 

मैं viewDidLoad और viewWillAppear के बीच कुछ भी नहीं करता हूं। यहाँ कैसे DatabasePath databaseHelper वर्ग है, जो applicationDidFinishLaunching पर पहले होता है में निर्दिष्ट किया जाए:

- (NSString *) getDBPath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:self.databaseName]; 
} 

stringByAppendingPathComponent रिटर्न एक NSString। असाइनमेंट के बाद मुझे सड़क पर कभी-कभी NSStorePath2 क्यों मिलता है?

मेरे पास अब बिना किसी समस्या के काम कर रहा है लेकिन बस [डेटाबेसहेल्पर getDBpath] को कॉल कर रहा है। मेरा लक्ष्य कुछ सीपीयू चक्रों को बचाने और उस मूल्य को स्टोर करना है। इसलिए डेटाबेसपैथ। कोई सुझाव क्यों डेटाबेसपाथ अमान्य में बदलता है?

+0

डाउनवॉट्स क्यों? यह बहुत अच्छे प्रश्नों की तुलना में एक बेहतर प्रश्न है जो बहुत सारे अपवॉट प्राप्त करता है! –

उत्तर

5

क्योंकि आपने मूल्य को बरकरार रखा नहीं है। जब आपको कुछ बनाए रखने की आवश्यकता होती है तो यह देखने के लिए Memory Management Programming Guide में नियमों की समीक्षा करें।

बेशक, सीडीएसपीनोसा नोट्स के रूप में, आपको शायद इस पथनाम को पहले स्थान पर कैश करने की आवश्यकता नहीं है। यह शायद एक बड़ा प्रदर्शन-हत्यारा नहीं है। प्रोफाइल पहले, फिर हॉट स्पॉट को अनुकूलित करें।

+0

आप कैसे कटौती करने में सक्षम हैं मैं डेटाबेस बनाए रखने के लिए कार्यान्वयन नहीं किया गया है जब मैं बनाए रखा नहीं है? यहां कार्यान्वयन है: @property (nonatomic, retain) NSString * डेटाबेसपाथ; – 4thSpace

+1

क्योंकि यही कारण है कि लक्षण। या तो आपकी वस्तु मर गई (क्योंकि आपने इसे बरकरार रखा नहीं है) या आपने इसे दूसरे के साथ बदल दिया है (और इसे बनाए रखा नहीं है)। या आपने इसे अधिक रिलीज़ किया है, लेकिन इसकी संभावना कम है। @property के लिए: क्या आप वास्तव में संपत्ति का उपयोग कर रहे हैं, या सीधे ivar को आवंटित कर रहे हैं? –

+0

>> ... या सीधे ivar को असाइन करना? << वह समस्या थी। डेटाबेस हेल्पर में, मैं self.databasePath के बजाय डेटाबेसपैथ असाइन कर रहा था। उत्तरार्द्ध मूल्य को बरकरार रखता है। क्या फर्क पड़ता है? और बड़ा धन्यवाद! – 4thSpace

3

मेरा मानना ​​है कि आपका मतलब एनएसपीएथस्टोर 2 है, न कि एनएसएसटोरपाथ।

एनएसपीएथस्टोर 2 एनएसएसटींग के आंतरिक निजी उप-वर्ग में है जिसका प्रयोग उपप्रणाली के बीच किया जाता है जहां स्ट्रिंग को फ़ाइल सिस्टम पथ कहा जाता है। यह उन सभी तरीकों से एनएसएसटींग के कार्यात्मक रूप से बराबर है जिनकी आप परवाह करेंगे।

यह आपकी पोस्ट से स्पष्ट नहीं है कि क्या आपको यह सोचने के अलावा कोई समस्या है कि वह वर्ग क्या है, और क्या इसे कैशिंग करके प्राप्त करने के लिए कोई अनुकूलन है या नहीं। जवाब संभवतः नहीं है: डेटाबेस तक पहुंचने पर CPU चक्रों का उपयोग करने वाली सभी चीजों में से, इसकी फ़ाइल सिस्टम पथ तक पहुंच शायद सूची में अंतिम होगी।

+0

मुझे आपके अंतिम पैराग्राफ को समझ में नहीं आया या आप मानते हैं कि आपका मूल्य अमान्य में क्यों बदल रहा है, यह कोई मुद्दा नहीं है। मैंने पद को और अधिक स्पष्ट होने के लिए संपादित किया है। निश्चित नहीं है कि -1 वोट क्यों है। – 4thSpace

+0

यह एक अवैध में नहीं बदला गया। यह कुछ भी नहीं बदल गया। "एनएसपीएथस्टोर 2 [एन] एनएसएसटींग का आंतरिक निजी उप-वर्ग है" -i.e।, वह ऑब्जेक्ट * एक एनएसएसटींग है।यह एनएसएसटींग का प्रत्यक्ष उदाहरण नहीं है; यह सबक्लास का एक उदाहरण है, जो काफी अच्छा है। बस इसका इलाज करें क्योंकि आप किसी भी अन्य एनएसएसटींग करेंगे। –

+0

समस्या यह है कि मैं डेटाबेसबेस में पथ की उम्मीद कर रहा हूं। लेकिन पथ होने के लिए उपयोग करते समय इसके बजाय "अमान्य" का मान प्राप्त करें। किसी भी कारण से, पथ मूल्य गायब हो गया। आप एनएसएसटींग और एनएसपीएथस्टोर 2 की परिभाषाएं देते रहते हैं, जो मैं नहीं पूछ रहा हूं। – 4thSpace

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