每个IBOutlet都应该有一个属性吗?

4

我们为了在其他视图中使用它而为变量创建属性。对于IBOutlets,我们也是这样做的。但并不总是为了使用它们。我们是否需要为我们在xib中刚刚创建的每个IBOutlet都创建一个属性?或者这只是一种好习惯?

6个回答

10
我认为在内存管理和外部访问方面考虑较为简便。如果需要外部访问,显然应该使用属性。(是的,内存管理简单,如果容易出错,那么就会在后面成为一个 bug)
80% 的时间我的视图控制器有 IBOutlets 并且没有其他人访问它们,因此 ivar 可以工作。 问题在于当您不使用 @property 时,分配的值仍然被保留。然后,即使您自己没有保留它,也需要记住释放它,这一点我觉得很反直觉。
因此,我通常对我不会更改的变量使用 @property (assign),对其他所有变量使用 @property (retain),并且从不将 IBOutlets 直接声明为 ivar。
例如:
@interface something : NSObject {
    //This one needs to be RELEASED then set to nil in both viewDidUnload, and dealloc.
    IBOutlet UILabel * myLabel;
    //also cannot be accessed outside of "something" class (technically it can, but don't do that)
    //I NEVER declare my outlets this way.
}

//This one can just be set to nil in viewDidUnload and dealloc
@property (nonatomic, retain) UILabel * myOtherLabel;
//it can also be accessed from mySomething.myOtherLabel by any other class.

//This one just works. I don't own it, the view owns it, so I don't retain/release.
@property (nonatomic, assign) UILabel * myOtherOtherLabel;
//It also provides access to outsiders.
//I wouldn't recommend using this type if you want to change the value though.

那解释了很多事情,Alex。感谢你的努力 :) - Nitish
1
很好的解释,可能是我经历过的但无法用言语表达出来的。+1。 - Praveen S

4

并不需要为每个IBOutlet创建一个属性。

具体来说,如果你只从声明该IBOutlet的类中访问它,那么你并不一定需要这个属性。如果有一个属性,你可以获得属性提供的优势,但你总是可以直接引用该IBOutlet

如果你计划从另一个类中访问该IBOutlet,那么一个属性是很有用的,这样你就不必自己定义setter和getter方法。


1

如果您只想在创建XIB的视图中使用IBOutlet,则无需在此处设置属性。但是,使用它是一个好习惯,不是每次为视图创建IBOutlet时都必须使用。


0

如果你要显示的内容不会改变,那么可以跳过为该小部件创建属性或IBOutlet。

例如,在一个屏幕上,你有一个标签和一个文本框,标签始终具有字符串“名称:”,而文本框用于获取用户输入,你只需为文本框创建引用输出来访问用户输入的数据。在这里为标签创建引用输出没有任何意义。

希望你明白了。


那么,如果我不为在同一视图中将更改其值的IBOutlet创建属性,应用程序会抛出错误吗? - Nitish
1
你无法访问它,因此你将无法更改它。 - Praveen S

0

属性是Objective-C中的一个特性,它允许我们自动生成访问器,并具有一些其他的附加好处。所以像Praveen S给你举了一个关于Label和UIText的例子,我只是稍微探索了一下。 假设你与UILabel没有任何关系,你不需要设置属性,但如果你要求用户在UITextField中输入一些文本,你必须设置属性。如果你使用retain设置属性,你必须在viewDidUnload中释放它。


0
如果你想改变显示内容,那么你应该添加属性。举个例子,如果我们想要改变标签的文本,我们需要使用IBOutlet和属性,这样我们才能够访问到由我们的nib构建的标签控件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接