जब ऐसा कुछ महंगा माना जाता है, तो इसका मतलब यह नहीं है कि आपको इसे कभी नहीं करना चाहिए, इसका मतलब यह है कि जब आप जितनी जल्दी हो सके एक विधि से बाहर निकलने की आवश्यकता होती है तो इसे परिस्थितियों में ऐसा करने से बचें। उदाहरण के लिए, जब आईफोन 3 जी नवीनतम डिवाइस था, तो मैं UITableView
के साथ एक एप्लीकेशन लिख रहा था जो प्रत्येक सेल में डिस्प्ले के लिए स्वरूपित संख्या (मैं जोड़ सकता हूं, यह तब था जब मैं आईओएस विकास में शुरुआत करने वाला था)।
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *reuseIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];
MyManagedObject *managedObject = [self.managedObjects objectAtIndex:indexPath.row];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[cell.textLabel setText:[managedObject title]];
[cell.detailTextLabel setText:[numberFormatter stringFromNumber:[managedObject amount]]];
return cell;
}
इस कोड के स्क्रॉलिंग निष्पादन भयानक थी: मेरी पहली कोशिश निम्नलिखित था। फ्रेम दर लगभग 15 एफपीएस तक गिर गई क्योंकि मैं हर बार tableView:cellForRowAtIndexPath:
पर एक नया NSNumberFormatter
आवंटित कर रहा था।
मैं इस के लिए कोड को बदलने के द्वारा यह तय:
- (NSNumberFormatter *)numberFormatter {
if (_numberFormatter != nil) {
return _numberFormatter;
}
_numberFormatter = [[NSNumberFormatter alloc] init];
[_numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
return _numberFormatter;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *reuseIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];
MyManagedObject *managedObject = [self.managedObjects objectAtIndex:indexPath.row];
NSNumberFormatter *numberFormatter = [self numberFormatter];
[cell.textLabel setText:[managedObject title]];
[cell.detailTextLabel setText:[numberFormatter stringFromNumber:[managedObject amount]]];
return cell;
}
यहाँ अंतर यह है कि मैं lazily एक इवर में NSNumberFormatter
लोड कर दिया है, ताकि tableView:cellForRowAtIndexPath:
के प्रत्येक रन नहीं रह गया है एक नया उदाहरण आवंटित करता है। इस सरल परिवर्तन ने स्क्रॉलिंग प्रदर्शन को लगभग 60 एफपीएस तक धक्का दिया।
यह विशिष्ट उदाहरण अब उतना प्रासंगिक नहीं है, क्योंकि नए चिप्स स्क्रॉलिंग प्रदर्शन को प्रभावित किए बिना आवंटन को संभालने में सक्षम हैं, लेकिन यह जितना संभव हो उतना कुशल होना बेहतर है।
स्रोत
2012-02-04 13:49:02
रूपरेखा दर्दरहित – justin
है आप निर्धारित करने के लिए जो तरीका अपनी आवश्यकताओं बेहतर सूट अपने अनुप्रयोग प्रोफ़ाइल कर सकते हैं। मुझे लगता है कि डेवलपर्स यह इंगित करना चाहते थे कि 'NSDateFormatter' के रूप में निर्दोष-ध्वनि के रूप में कुछ कुछ जटिल जटिल प्रारंभकर्ता कोड हो सकता है, इसलिए प्रारंभिक ऑब्जेक्ट को जितना संभव हो सके पुन: उपयोग करने के लिए दस्तावेज़ में एक संकेत दिया गया है। –