iOS app来回填充内存,同时来回移动

时间:2013-04-28 09:32:37

标签: ios objective-c sdk

在我的iOS应用程序中,当我从viewController A se到se时,使用系统内存就可以了。

但问题是当我从viewController A se到se然后再回到A并再次回到B时,这会让你的内存越来越多。

为什么在返回查看A时没有释放所有已用内存。

我正在使用自动释放池。我不再需要变量了。

注意:我在View B中使用GCD,但我也在GCD中释放内存。

我不知道为什么会发生这种情况。或者,当我在视图A中时,有没有办法完全卸载视图B使用的所有资源?

更新

我不是从B回到A.我只是使用后退按钮。

这是我从视图A中的segue

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

@autoreleasepool {

PhotosCollectionViewController *photoCollection=[segue destinationViewController];
NSIndexPath *path=[self.tableView indexPathForSelectedRow];

// get the cell tag for the selected row
NSIndexPath *path1=[NSIndexPath indexPathForRow:[path row] inSection:0];

UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:path1];

[photoCollection setPassedID:[[elements objectAtIndex:path1.row] objectAtIndex:0]];
// set the title of the next view controller
[photoCollection setTitle:cell.textLabel.text];

photoCollection=nil;
path=nil;
path1=nil;

}

}

修改

我在viewDidLoad中的视图中使用的长时间运行过程

photoQueue=dispatch_queue_create("com.prepare.photos", nil);
dispatch_async(photoQueue, ^{

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(goToBackground)
                                                 name:UIApplicationWillResignActiveNotification object:nil];


display_photos=[[NSMutableArray alloc] init];




// iterate through photos array and create MWPhoto object out of it

// init ns cache
//myCache=[[NSCache alloc] init];

    int j=0;

    for(j=0;j<[photos count];j++){
        //NSLog(@"filename %@",[[photos objectAtIndex:i] objectAtIndex:0]);

        MWPhoto *mw=[MWPhoto photoWithFilePath:[self.documentsDirectory stringByAppendingPathComponent:[[photos objectAtIndex:j] objectAtIndex:0]]];

        [display_photos addObject:mw];
        mw=nil;


    }

    //dispatch_release(photoQueue);

});

2 个答案:

答案 0 :(得分:0)

回答我自己的问题。它填补内存的原因是,当我从sqlite数据库中检索到一些数据时,我关闭了sqlite连接。因此,查看新视图将重新打开数据库连接,这将导致过多的内存使用。

所以底线,不要关闭sqlite数据库连接。

答案 1 :(得分:0)

Segues加载视图控制器的新实例;因此,当您使用segue将视图控制器A导航到B时,使用segue是有意义的。

A_1 -> B_1

但是,如果您使用segue从B导航到A,则表示您正在创建视图控制器A的新实例,而不是返回到先前的视图控制器A实例。

  

A_1 - &gt; B_1 - &gt; A_2

来回瞄准会导致:

  

A_1 - &gt; B_1 - &gt; A_2 - &gt; B_2 - &gt; A_3 - &gt; ...

理想情况下,您想要的是:

  

A_1 - &gt; B_1 - &gt; A_1

(从B_1回到A_1)

要实现此目的,您可能希望将此方法用于从视图控制器B导航到A的按钮。

- (IBAction)backButton:(UIButton *)sender
    {
        [self dismissViewControllerAnimated:YES completion:^(void){
            NSLog(@"View controller dismissed");
            // things to do after dismissing
        }];
}