मेरे पास एक UIViewController है जो सामान्य रूप से प्रस्तुत किया गया है। जब मैं स्मृति आवंटन उपकरण देखता हूं, दृश्य प्रस्तुत होने पर स्मृति उपयोग बढ़ता है, लेकिन जब यह निकल जाता है तो स्मृति जारी नहीं होती है। यदि मैं दृश्य को खोलना और बंद करना जारी रखता हूं, तो स्मृति केवल उच्च हो रही है। उपकरण स्मृति रिसाव की रिपोर्ट नहीं करता है! इसका कारण क्या हो सकता है? व्यू कंट्रोलर कोड नीचे है (मैंने didSelectRow कोड छोड़ दिया है)। डेलोक को हमेशा बुलाया जाता है।UIViewController में संभावित स्मृति रिसाव UITableView
संपादित करें - मैं एआरसी
उपयोग कर रहा हूँ ज
#import <UIKit/UIKit.h>
@class OutlineTextUILabel;
@interface StoreViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
int starCount;
NSMutableArray *_singleUseArray;
NSMutableArray *_fullUseArray;
}
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet OutlineTextUILabel *starCountLbl;
- (IBAction)exitBtnPressed:(id)sender;
मीटर
#import "StoreViewController.h"
#import "NSUserDefaults+MPSecureUserDefaults.h"
#import "PowerUpCell.h"
#import "OutlineTextUILabel.h"
#import "PowerUpSingleton.h"
#import "PowerUp.h"
#define kPrefsNumberOfStars @"numberOfStars"
@interface StoreViewController()
@end
@implementation StoreViewController
@synthesize tableView = _tableView;
@synthesize starCountLbl;
#pragma mark View Methods
- (void)viewDidLoad
{
[super viewDidLoad];
// Display star count
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
BOOL valid = NO;
starCount = [prefs secureIntegerForKey:kPrefsNumberOfStars valid:&valid];
if (!valid) {
NSLog(@"Stars Tampered With!");
self.starCountLbl.text = @"Err";
} else {
self.starCountLbl.text = [NSString stringWithFormat:@"%d",starCount];
}
// Tableview setup
CGRect frame2 = CGRectMake(0, 0, 320, 40);
UIView *footer = [[UIView alloc] initWithFrame:frame2];
footer.backgroundColor = [UIColor clearColor];
self.tableView.tableFooterView = footer;
self.tableView.opaque = NO;
self.tableView.backgroundView = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
if (![[PowerUpSingleton sharedList] refreshArray]) {
NSLog(@"Error, %s",__FUNCTION__);
} else {
[self performSelectorOnMainThread:@selector(workOutSingleUseToDisplay) withObject:nil waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(workOutFullUseToDisplay) withObject:nil waitUntilDone:YES];
[self.tableView reloadData];
}
}
- (void)workOutSingleUseToDisplay
{
_singleUseArray = [[NSMutableArray alloc] init];
for (PowerUp *pu in [[PowerUpSingleton sharedList] sharedArray]) {
if (!pu.fullUnlock) {
[_singleUseArray addObject:pu];
}
}
}
- (void)workOutFullUseToDisplay
{
_fullUseArray = [[NSMutableArray alloc] init];
for (PowerUp *pu in [[PowerUpSingleton sharedList] sharedArray]) {
if (pu.prefFullName != nil) {
[_fullUseArray addObject:pu];
}
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}
- (void)viewDidUnload {
[self setTableView:nil];
[self setStarCountLbl:nil];
[super viewDidUnload];
}
#pragma mark TableView Setup Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 2;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return @"Single Use";
} else if (section == 1) {
return @"Use forever";
}
return nil;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0) {
return [_singleUseArray count];
} else if (section == 1) {
return [_fullUseArray count];
}
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier;
if (indexPath.section == 0) {
cellIdentifier = @"powerUpCellSingleUse";
} else if (indexPath.section == 1) {
cellIdentifier = @"powerUpCell";
}
PowerUpCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[PowerUpCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
if (indexPath.section == 0) {
PowerUp *tmpPU = [_singleUseArray objectAtIndex:indexPath.row];
cell.descriptionLbl.text = tmpPU.displayName;
int cost = tmpPU.costSingle;
cell.costLbl.text = [NSString stringWithFormat:@"%d",cost];
if (cost > starCount) {
cell.costLbl.textColor = [UIColor redColor];
} else {
cell.costLbl.textColor = [UIColor blueColor];
}
int howMany = tmpPU.numberOwned;
cell.howManyLbl.text = [NSString stringWithFormat:@"%d",howMany];
} else if (indexPath.section == 1) {
PowerUp *tmpPU = [_fullUseArray objectAtIndex:indexPath.row];
cell.descriptionLbl.text = tmpPU.displayName;
int cost = tmpPU.costFull;
cell.costLbl.text = [NSString stringWithFormat:@"%d",cost];
if (cost > starCount) {
cell.costLbl.textColor = [UIColor redColor];
} else {
cell.costLbl.textColor = [UIColor blueColor];
}
if (tmpPU.fullUnlock) {
cell.costLbl.textColor = [UIColor greenColor];
cell.costLbl.text = @"---";
}
}
return cell;
}
#pragma mark -
- (IBAction)exitBtnPressed:(id)sender
{
[self dismissModalViewControllerAnimated:YES];
}
- (void)dealloc
{
NSLog(@"%s",__FUNCTION__);
self.tableView = nil;
self.starCountLbl = nil;
}
@end
संपादित करें ------------- कुछ नहीं लगता है ठीक होने के लिए। मैंने सेल एलोक में एक एनएसएलॉग जोड़ा है, और इसे कभी भी नहीं कहा जाता है, भले ही कोशिकाएं बनती हैं!
PowerUpCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
NSLog(@"new cell");
cell = [[PowerUpCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
संपादित 1st जुलाई ------ मैं एक नेविगेशन नियंत्रक जोड़ दिया है और अब मोडल के बजाय धक्का का उपयोग करें और इस समस्या को अभी भी यहाँ है। मैंने कुछ बार विचारों के बीच पीछे और आगे बढ़कर इंस्ट्रूमेंट्स के साथ ढेर शॉट्स ले लिए हैं और ऐसा लगता है कि कोशिकाएं अभी भी आसपास लटक रही हैं, क्योंकि यह स्क्रीनशॉट अभी भी दृश्य के पिछले लोड से इशारा पहचानकर्ता दिखाता है।
viewWillAppear के अंदर आप performOnMainThread का उपयोग करते हैं। इसकी आवश्यकता नहीं है, मुख्य थ्रेड पर ViewWillAppear होता है। –
मैंने केवल इस विधि का उपयोग किया है, इसलिए मैं प्रतीक्षा कर सकता हूं कोई भी नहीं: हाँ तो अब मैं तालिका खींचने से पहले सरणी भर चुका हूं। – Darren
बस इसे आज़माएं: [स्वयं का कामOutFullUseToDisplay]। आपको एहसास है कि उद्देश्य-सी अनुक्रमिक सही है? –