在我的 ViewController 中,我创建了一些对象,我需要在 Controller 本身的各个地方使用这些对象,但在它之外的任何地方。我是这样做的:
@implementation MyController1
NSString *myString;
- (void)myFirstMethod {
myString = @"hello world";
}
...
@end
我没有将它们放在头文件中,也没有在如下所示的接口(interface)声明中使用 @property
定义它们:
@interface MyController1 ()
// could define myString with @property here
@end
我的代码没有任何问题,但我想确保我没有违反安全规范。我知道我可以将它们放在头文件或实现文件中并使用 @private
,但为了代码简洁,我没有这样做。这样可以吗?不再需要使用 @synthesize
对此有什么影响吗?
谢谢,
最佳答案
这完全没问题,只要您知道实例变量(又名“成员变量”或“ivar”)和静态变量之间的区别。例如,在此处的示例 (@"hello world"
) 中,只有 一个 字符串对象与您的 myString
变量相关联,无论您创建了多少个 MyController1
对象,不是类 MyController1
的每个实例。所以在这种情况下,myString
的行为既不像属性也不像实例变量。
此外,静态变量的生命周期更长——它将比 MyController1
对象的所有实例都长寿,只有在程序退出时才会被释放,或者如果你明确地这样做,比如你是否分配了它在堆上开始(在 @"hello world"
的情况下您不会这样做,但当然可能会使用其他静态变量)。
这两种类型/方法各有利弊。例如,ivars 可以跟踪对象状态,但这意味着对象的每个实例都更大,因为它们每个都必须为该状态分配内存。因此,如果内存性能在您的应用程序中很重要,除非您需要,否则不应使用 ivars。另一方面,静态变量适用于“一次性”——与对象状态无关的事物,但如果它们可以被多个线程上的多个对象写入,则通常必须受到保护。这些只是一些对比……还有很多其他对比,具体取决于您要执行的操作。
关于 @synthesize
的最后一个问题,不使用它只意味着不会有任何自动生成的变量访问器,这很好,因为变量不是 ivar 并且无论如何都不与 MyController1
对象的实例相关联。
关于ios - 在 iOS 中不使用 @property 可以创建类本地引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084765/