gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:52:33 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com