- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我这样做:
@interface RegisterController : UIViewController <UITextFieldDelegate>
{
IBOutlet UITextField *usernameField;
}
@interface RegisterController : UIViewController <UITextFieldDelegate>
{
UITextField *usernameField;
}
@property (nonatomic, retain) IBOutlet UITextField *usernameField;
最佳答案
为了清晰和一致,建议您为所有 IBOutlets 声明属性。
详细信息在 Memory Management Programming Guide 中有详细说明。 .基本要点是,当您的 NIB 对象未归档时,nib 加载代码将通过并使用 setValue:forKey: 设置所有 IBOutlets。当您在属性上声明内存管理行为时,发生的事情并不神秘。如果 View 被卸载,但您使用了声明为保留的属性,您仍然可以获得对文本字段的有效引用。
也许一个更具体的例子会有助于说明为什么你应该使用保留属性:
我将对您正在工作的上下文做出一些假设——我将假设上面的 UITextField 是另一个由 UIViewController 控制的 View 的 subview 。我会假设在某个时候, View 不在屏幕上(也许它在 UINavigationController 的上下文中使用),并且在某个时候您的应用程序会收到内存警告。
因此,假设您的 UIViewController 子类需要访问其 View 以在屏幕上显示它。
此时,nib 文件将被加载,每个 IBOutlet 属性将由 nib 加载代码使用 setValue:forKey: 设置。这里要注意的重要事项是将设置为 UIViewController 的 View 属性的顶级 View (它将保留此顶级 View )和您的 UITextField,它也将被保留。如果它只是简单设置,则 Nib 加载代码将保留它,否则该属性将保留它。 UITextField 也将是顶层 UIView 的 subview ,所以它会有一个额外的保留,在顶层 View 的 subview 数组中,所以此时文本字段已经被保留了两次。
此时,如果您想以编程方式切换文本字段,您可以这样做。在这里使用该属性可以使内存管理更加清晰;您只需使用新的自动发布文本字段设置属性。如果您没有使用过该属性,您必须记得释放它,并可选择保留新的。在这一点上,谁拥有这个新的文本字段有点含糊不清,因为内存管理语义不包含在 setter 中。
现在假设一个不同的 View Controller 被推送到 UINavigation Controller 的堆栈上,因此该 View 不再位于前台。在内存警告的情况下,这个离屏 View Controller 的 View 将被卸载。此时,顶层 UIView 的 view 属性会被清零,会被释放和解除分配。
因为 UITextField 被设置为一个被保留的属性,所以 UITextField 不会被释放,因为它唯一的保留是顶级 View 的 subviews 数组。
如果 UITextField 的实例变量不是通过属性设置的,它也会存在,因为 Nib 加载代码在设置实例变量时保留了它。
这突出的一个有趣的点是,因为 UITextField 通过属性另外保留,您可能不希望在内存警告的情况下保留它。出于这个原因,您应该将 -[UIViewController viewDidUnload] 方法中的属性置空。这将摆脱 UITextField 上的最终版本并按预期解除分配。如果使用该属性,您必须记住明确释放它。虽然这两个操作在功能上是等效的,但意图是不同的。
如果您没有换出文本字段,而是选择将其从 View 中移除,那么您可能已经将其从 View 层次结构中移除并将属性设置为 nil,或者释放了文本字段。虽然在这种情况下可以编写正确的程序,但很容易在 viewDidUnload 方法中产生过度释放文本字段的错误。过度释放对象是导致崩溃的错误;将一个已经为零的属性再次设置为 nil 不是。
我的描述可能过于冗长,但我不想遗漏场景中的任何细节。当您遇到更复杂的情况时,只需遵循这些准则将有助于避免出现问题。
另外值得注意的是,Mac OS X 桌面上的内存管理行为有所不同。在桌面上,设置一个没有setter的IBOutlet不保留实例变量;但如果可用,再次使用 setter。
关于iphone - 如果我不保留 IBOutlet 会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1250518/
这个问题在这里已经有了答案: 关闭 10 年前。
我创建了一个自定义单元格: #import #import "SevenSwitch.h" @interface cellaMain : UITableViewCell { SevenSwi
我有一个颜色选择器项目。对于每个颜色组件(红色、绿色和蓝色),我有一个 UIPickerView、一个文本字段和一个步进器。我想做的是创建一个类,我们将其命名为 ColorPickerObject,如
我目前正在使用统一的 Storyboard(带有尺寸等级)。对于我的观点之一,wAny hAny 和 wRegular hRegular 大小类之间的设计差异非常明显,以至于根据大小类更改 subvi
class AClass: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { @IBOutlet var m
我在同一个 nib 文件中有我的主应用程序 View Controller (文件所有者)、它的第一响应程序、 View 和其他 3 个 UIViewController。 3 个 UIViewCon
我创建了以下自定义 View : @interface TNGalleryView : UIView @property (assign, nonatomic) id delegate; @prop
我制作了一个自定义的 UITableViewCell,我在其中添加了 2 个标签和一个 UIImageView,每个标签都带有 IBOutlets。 IBOutlet weak var imageVi
我的大多数 View Controller 中有几个 socket ,我总是将它们与头文件中的属性链接起来,如下所示: IBOutlet UIButton *homeButton; @property
在大多数示例中,我看到 IBOutlet 的以下设置: (Example A) FooController.h: @interface FooController : UIViewController
我的 EAGLView 类中有一个类“A”的实例,它在 EAGLView 的 initWithCoder 方法中实例化。 此类“A”包含 UIView 的 IBOutlet。 我在 Interface
加快Cocoa iPhone/Mac开发速度,我知道原子和非原子属性之间的区别,以及与非原子的性能差异,但是IBOutlet的每个定义我见过的属性指定非原子的,而不是默认的原子的。我无法找到解释这是一
我正在尝试设置来自不同类的 NSTextField 的文本.. 这就是我所拥有的: 首选项.h @interface Preferences : NSObject { IBOutlet NSTextF
我有一个基于文档的 cocoa 应用程序,应用程序菜单中的一个项目连接到一个IBAction。单击该项目需要执行一项使用主 nib 文件中的 IBOutlet 的任务,该文件使用另一个类 MyDocu
我通过 Interface Builder 设置了 TextView 的导出。 TextView 加载正常,但是我无法以编程方式访问它的任何属性,因为导出始终为 nil。 什么时候实例化?即使在调用我
这是一个我已经被困了两个小时的问题了!我有一个带有静态单元格表 View 的 TableView Controller 。在静态 TableView 单元之一中,我放置了一个带有动态单元的 Tab
是否需要将所有声明为IBOutlet的带有retain修饰符的@property设置为nil - (void)dealloc 方法?如果我不这样做,内存会被消耗/浪费吗? 假设自动引用计数关闭。 最佳
我有A级和子类 ClassB 是否可以将 UIImage 选择器中的图像从 ClassA 传递到 ClassB NSLog(@"Camera Dismiss Method Reached"); [pi
我有 2 个 swift 文件,一个是我的 HomeViewController,第二个是我的 EventCollectionViewCell。在第二个中,我有一个 IBOutlet = inform
我目前正在制作一个路线跟踪应用程序来教我自己如何快速。我具有处理正在跟踪的路线和从单个 SessionController 类中绘制折线的基本功能,但我想将该类拆分为单独的对象。 这就是我遇到问题的地
我是一名优秀的程序员,十分优秀!