- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我很难理解 UIViewController 中的几个方法,但首先我会说出我认为它们的用途(忽略界面生成器,因为我没有使用它):
-init
:初始化在低内存情况下不需要释放的非 View 相关的东西(即不是对象或不能轻易重新创建的对象)。-loadView
:创建 View 设置[self view]
属性。-viewDidLoad
:创建所有其他 View 元素-viewDidUnload
:释放在-viewDidLoad
中创建的对象。didReceiveMemoryWarning
:内存不足的情况,释放缓存数据等不必要的东西,如果这个view没有superview那么[super didReceiveMemoryWarning]
会继续释放(卸载) View 并调用 -viewDidUnload
。-dealloc
:释放一切-viewWillAppear:
, -viewDidAppear:
, -viewWillDisappear:
, -viewDidDisappear:
不言自明,没有必要,除非您想对这些事件做出回应(做某事)。
我不确定有几件事。首先,Apple 文档说当 -viewDidUnload
被调用时, View 已经被释放并设置为 nil。
-loadView
来重新创建 View 吗?-viewDidLoad
中创建了一些我没有为其创建 ivar/property 的东西,因为没有必要并且它将被 View 保留(因为它们是它的 subview ).所以当 View 被释放时,它也会释放那些,对吧?当 View 被释放时,它会释放它所有的 subview 吗?因为我在-viewDidLoad
中创建的所有对象都是[self view]
的 subview 。因此,如果它们已经被释放,为什么要在 -viewDidUnload
中再次释放它们?我可以理解在这些方法中加载和卸载 View 可见时所需的数据,但就像我问的那样,如果 subview 已经被释放,为什么还要释放它们?编辑:阅读其他问题后,我想我可能已经明白了(我的第二个问题)。在我只使用局部变量的情况下,分配它,使其成为 subview 并释放,它的保留计数将为 1(将其添加为 subview ),因此当 View 被释放时也是如此。现在对于带有 ivars 指向它们的 View 元素,我没有使用属性,因为没有外部类需要访问它们。但现在我认为那是错误的,因为在这种情况下:
// MyViewController.h
@interface MyViewController : UIViewController {
UILabel *myLabel;
}
// MyViewController.m
. . .
- (void)viewDidLoad {
myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 10)];
[myLabel setText:@"Foobar"];
[[self view] addSubview:myLabel];
}
- (void)viewDidUnload [
// equivalent of [self setMyLabel:nil]; without properties
[myLabel release];
myLabel = nil;
}
在那种情况下,标签将在它被释放后发送 -release
消息,因为 ivar 没有保留它(因为它不是一个属性)。但是对于属性,保留计数将是两个:保留它的 View 和属性。那么在 -viewDidUnload
中它将被释放。所以最好总是为这些东西使用属性,对吗?或不?
最佳答案
Will
-loadView
get called again to recreate the view later on?
是的,一旦有人访问 view
属性。
When the view is released, will it release all its subviews?
是的。
至于标签和以后不需要的东西,通常的做法是在将它们附加到 View 后简单地释放它们:
UILabel *foo = [[UILabel alloc] init…];
[self.view addSubview:foo];
[foo release];
在这种情况下,标签将在 View 被释放时被释放。
您的示例中的内存管理很好。当您 alloc
标签时,它的 retainCount
跳到 1, View 保留它 (retainCount
= 2),然后 View 被释放并释放标签 (rc
= 1),然后您最终自己释放标签 (rc
= 0, dealloc)。
为了让事情更清楚——变量 myLabel
没有明确保留标签,但你仍然拥有它,因为你分配了它。这是 Cocoa 内存管理的基本规则之一:alloc
+1, retain
+1, release
-1, autorelease
-1 之后。
例子:
@property(retain) UILabel *foo;
self.foo = [[UILabel alloc] init…];
这将是一个泄漏,因为标签在分配期间获得 +1,而在为 foo
属性生成的 setter 中获得另一个 +1。阅读 Cocoa 内存管理指南或 Scott Stevenson’s Objective-C tutorial . Cocoa 中的内存管理非常简单,经过一番思考后,您应该在所有情况下都感到非常自在。
关于iPhone 开发者 - viewDidUnload subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958973/
所以我刚刚开始编写 iPhone 应用程序,一个潜在的雇主问我,“你的开发者句柄是什么?”他所说的“开发者句柄”到底是什么意思? 最佳答案 很可能您的应用程序在 iTunes 商店中列出的名称。这可以
我刚刚编译并运行了 hello world 应用程序,它运行良好。我通读了 android 文档中的一堆内容,内容涉及 android 的差异组件以及它们如何协同工作。现在我想制作一些链接到各种操作的
我不是 Android 开发人员,我试图了解他们在图形资源方面需要什么来制作可在许多 Android 设备上运行的应用程序。 我已经(尝试)阅读此页 http://developer.android.
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
如何编写程序来实现滑动 MUITableCell 的功能。我已经有一个我一直在使用的 MUITableCell 的子类。我是否只处理其中的滑动,就像处理 View 一样? 最佳答案 您需要实现此方法:
堆栈溢出, 是否有其他人在 Facebook 上遇到阻止注册为 Facebook 开发人员的能力的错误?该按钮对我显示为灰色。 当我尝试单击按钮将“否”切换为"is"时,没有任何功能。 我在互联网和
我正在尝试为 iOS Developer PageControl Sample 实现建议的优化。 .这是我在 PhoneContentController 中使用的代码: // A possible
您好,我写了一段代码来使用 Pubnub channel 发布 json: pubnubMessage = new Pubnub("demo", "demo"); Suppor
我正在熟悉 iOS 上的 SQLite。我正在尝试进行简单的用户注册,但是年龄值 (NSInteger) 总是变成一些大的负数,例如 -1073752692。这是我的注册码: - (User*
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improv
我的问题是,当我检查位置服务和数据是否关闭时,我的手机不会弹出没有启用数据或位置访问的通知,就像如果其中一个为假,它会显示通知。此功能在我的华为 P8 Lite 上不起作用,但在我的 Nexus 模拟
我正在开发一个需要集成 Paypal API 的 php 项目。我选择了 REST API。但我有一个企业账户(沙盒)。是否可以使用此帐户类型调用 REST API? 最佳答案 您需要使用任何有效的
我 6 个月前在 http://developer.paypal.com 上创建了一个应用程序.我已经创建了一些帐户以在沙盒模式下进行测试。昨天我检查了http://developer.paypal.
我很难理解 UIViewController 中的几个方法,但首先我会说出我认为它们的用途(忽略界面生成器,因为我没有使用它): -init:初始化在低内存情况下不需要释放的非 View 相关的东西(
我在构建我的应用程序时达到了 youtube api 配额限制,所以我向请求添加了一个开发人员 key ,现在我收到 403 错误:无效的开发人员 key 。 我曾多次尝试重新创建我的项目和 api
我搜索了http://espn.go.com/apis/devcenter/但找不到任何可以创建 API key 的地方。我还在 ESPN 创建了一个帐户,但没有运气。 最佳答案 4 个月前未公开 (
我阅读了处理此类问题的不同主题,但我仍然没有答案。这是我的问题: 在我的头文件中,我有这个: int cl, ch, _a = a, _b = b;\ __asm__ ("smull %0,
我实际上正在使用fbconnect,并且我正在尝试获取代表一个月前的unix时间。我对 1970 年以来的事情感到非常困惑。因为有人给我指出了正确的方向? 最佳答案 与 Unix epoch ,时间“
是否有任何工具可以让我监控内存使用和泄漏?例如,我想跟踪手动释放对象与启用 ARC 时自动释放对象时的内存使用情况。 最佳答案 它被称为 Instruments,您可以从 Product -> Pro
我正在使用 AllRoundAutomatation 的 Pl/sql 开发人员,现在我遇到了一个非常有趣的问题,我只想为 scoll up 配置 CTRL+UP 组合键!但我做不到,我该怎么做? 注
我是一名优秀的程序员,十分优秀!