2012-07-03 29 views
0

我正在开发一款可拍照的应用程序。iPhone:内存警告破坏强壮的物体?

最近我遇到了一个很奇怪的行为,这里是我的代码。

@interface ViewControllerPhotos : UIViewController 
@property (strong) NSString* _albumID; 
@end 

@implementation ViewControllerPhotos 
@synthesize _albumID; 

- (void)didReceiveMemoryWarning 
{ 
    return; 
    // commented or not : give the same issue 
    // [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigationItem setHidesBackButton:YES]; 

    self._albumID = [Tools generateUUID]; 

    NSLog(@"new photoset : local UUID \"%@\"", self._photoSetLocalID); 
} 

@end 

我的问题是:如果有一个内存警告,存储在_albumID的UID被遗忘和再生,所以我的专辑分为二。为什么? strong关键字不能保持当前值吗?

还是因为viewDidload被再次调用?如果是这样的话,那么如何确定我们第一次加载我们的视图以获得适当的init?这些方法听起来是为它设计的。

+0

默认情况下,对象强壮,所以strong关键字在此处不起作用。尝试将您的albumID写入文件并在收到内存警告时进行检索。 – Dustin

+0

'if(!self._albumID || [self._albumID isEqualToString:@“”])self._albumID = [Tools generateUUID];'in'viewDidLoad'解决了它! – dvkch

回答

2

嗯,你可以使用调试器和手动算出来,但是......

viewDidLoad时调用视图负载。在视图控制器不可见的低内存情况下,视图可能被卸载。 iOS3 +中有一个viewDidUnload方法。然后,当您按下后退按钮并且视图再次可见时,您将怀疑再次调用viewDidLoad

解决此问题的方法是存储UUID,以便在其重新加载时不会重新生成生成的

或者,您可以将任务置于init方法中。这样它只能被称为一次。

+0

确实'viewDiLoad'被再次调用,但是'init'。这意味着每个视图都应该从'init'方法初始化,但是在这种情况下,一些图形参数如'frame'不可用。这是处理内存警告的一种奇怪的方式,但也许是最好的,但似乎缺乏文档! – dvkch