gpt4 book ai didi

ios - 内存警告释放 View Controller ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:57:01 25 4
gpt4 key购买 nike

我有一个主要的 UIViewcontroller (vcMain),其中有两个 UIViewControllers 从主要的子类化而来。两个子类 UIViewcontrollers (vcSub1/vcSub2) 都只显示图像和更多控件。 vcSub1 和 vcSub2 显示在 UITabBarController 中。我已经像这样实现了 didReceiveMemoryWarning:

vcMain:

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];

if ([self isViewLoaded] == NO) {
// release the model, will be recreated in viewDidLoad
[_brain release], self.brain = nil;
}
}

vcSub1:

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];

if ([self isViewLoaded] == NO) {
// will be recreated in viewDidLoad, only exists in vcSub1
[self.zoomBrain release], [self setZoomBrain:nil];

_button = nil; // autoreleased, created programmatically
}
}

vcSub2:

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];

if ([self isViewLoaded] == NO) {
// nothing in here (yet)
}
}

当我第一次模拟内存警告时,一切似乎都正常。

Received simulated memory warning.
-[AppDelegate applicationDidReceiveMemoryWarning:] [Line 81]
-[vcSub2 didReceiveMemoryWarning] [Line 102]
-[vcMain didReceiveMemoryWarning] [Line 73]
-[vcSub2 viewDidUnload] [Line 112]
-[vcMain viewDidUnload] [Line 65]
-[vcSub1 didReceiveMemoryWarning] [Line 150]
-[vcMain didReceiveMemoryWarning] [Line 73]
-[vcSub1 viewDidUnload] [Line 143]
-[vcMain viewDidUnload] [Line 65]

我可以毫无问题地一次又一次地这样做。但是,如果我切换标签页(从而重新加载 View )并再次模拟内存警告,我会得到以下信息:

Received simulated memory warning.
-[AppDelegate applicationDidReceiveMemoryWarning:] [Line 81]
-[vcSub2 didReceiveMemoryWarning] [Line 102]
-[vcMain didReceiveMemoryWarning] [Line 73]
-[vcSub1 didReceiveMemoryWarning] [Line 150]
-[vcMain didReceiveMemoryWarning] [Line 73]
-[vcSub1 viewDidUnload] [Line 143]
-[vcMain viewDidUnload] [Line 65]
*** -[vcSub1 isViewLoaded]: message sent to deallocated instance 0x614de80

info malloc-history 0x614de80 显示该实例是 vcSub1 viewcontroller。

Alloc: Block address: 0x0614de80 length: 192
Stack - pthread: 0xa0425540 number of frames: 21
0: 0x93f7f0a3 in malloc_zone_calloc
1: 0x93f7effa in calloc
2: 0x154a2d4 in class_createInstance
3: 0x13165d8 in +[NSObject(NSObject) allocWithZone:]
4: 0x13163da in +[NSObject(NSObject) alloc]
5: 0x2bf0 in -[AppDelegate application:didFinishLaunchingWithOptions:] at AppDelegate.m:47
6: 0x8dec89 in -[UIApplication _callInitializationDelegatesForURL:payload:suspended:]
7: 0x8e0d88 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
8: 0x8eb617 in -[UIApplication handleEvent:withNewEvent:]
9: 0x8e3abf in -[UIApplication sendEvent:]
10: 0x8e8f2e in _UIApplicationHandleEvent
11: 0x30b9992 in PurpleEventCallback
12: 0x13d3944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
13: 0x1333cf7 in __CFRunLoopDoSource1
14: 0x1330f83 in __CFRunLoopRun
15: 0x1330840 in CFRunLoopRunSpecific
16: 0x1330761 in CFRunLoopRunInMode
17: 0x8e07d2 in -[UIApplication _run]
18: 0x8ecc93 in UIApplicationMain
19: 0x28f9 in main at main.m:14
20: 0x2875 in start

为什么如何我的 vcSub1 viewcontroller 被释放?

最佳答案

我认为您释放对象的次数太多了。假设你的属性(property)是(保留)那么你在这里有一个错误:

[self.zoomBrain release]
[self setZoomBrain:nil];

第一行会释放zoomBrain。

第二行将释放zoomBrain,然后将其设置为nil。

您要发布两次 - 您只需要第二行。如果您使用 setter 方法(即 setZoomBrain:),那么它会自动为您释放之前的 zoomBrain。

这个也是一样的:

[_brain release];
self.brain = nil;

调用 self.brain 是一种不同的写法 [self setBrain:nil]; - 同样,release 将被调用两次。

在每种情况下你只需要第二行:

self.brain = nil;

关于ios - 内存警告释放 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com