ios - 在 iOS 中不使用 @property 可以创建类本地引用吗?

标签 ios memory-management memory-leaks reference

在我的 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/

相关文章:

objective-c 二进制表达式的无效操作数 double 到 double

ios - UIControl.appearance().addTarget 停止在 Swift 4 上工作

objective-c - 检索视频 ram 使用 iphone

c++ - STL 实现之间分配策略的差异?

c++ - 堆与堆栈内存使用 C++ 用于动态创建的类

Android:旋转屏幕时删除/销毁对象

c++ - 如果我们不删除内存并且应用程序已经退出,是否存在内存泄漏

ios - swift 中的多个枚举值

ios - EXC_BAD_ACCESS 尝试获取单元格的 reuseIdentifier

C++ 在一个函数中分配动态内存并清除另一个函数