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

在iOS中不使用@property创建类本地引用可以吗?,ios,memory-management,memory-leaks,reference,Ios,Memory Management,Memory Leaks,Reference,在我的ViewController中,我创建了一些需要在控制器本身的各个位置使用的对象,但不在控制器之外。我是这样做的: @implementation MyController1 NSString *myString; - (void)myFirstMethod { myString = @"hello world"; } ... @end @interface MyController1 () // could define myString with @property

在我的ViewController中,我创建了一些需要在控制器本身的各个位置使用的对象,但不在控制器之外。我是这样做的:

@implementation MyController1

NSString *myString;

- (void)myFirstMethod {
   myString = @"hello world";
}
...
@end
@interface MyController1 ()
    // could define myString with @property here
@end
我没有将它们放在头文件中,也没有在接口声明中使用
@property
定义它们,如下所示:

@implementation MyController1

NSString *myString;

- (void)myFirstMethod {
   myString = @"hello world";
}
...
@end
@interface MyController1 ()
    // could define myString with @property here
@end
我的代码没有任何问题,但我想确保我没有违反安全规程。我知道我可以将它们放在头文件或实现文件中,并使用
@private
,但为了代码简洁,我没有这样做。这样可以吗?不再需要使用
@synthesis
是否会对此产生影响


谢谢,

这很好,只要您知道实例变量(又称“成员变量”或“ivar”)和静态变量之间的区别。例如,在这里的示例中,只有一个字符串对象与
myString
变量关联(
@“hello world”
),无论您创建了多少
MyController1
对象,而不是类
MyController1
的每个实例。因此,通过这种方式,
myString
的行为既不像属性,也不像实例变量

此外,静态变量的生命周期更长——它将超过
MyController1
对象的所有实例,只有在程序退出时才会解除分配,或者如果您显式地这样做,比如说您是否在堆上分配了它(在
@“hello world”的情况下不会这样做)
,但当然可能与其他静态变量有关)

两种类型/方法都有利弊。例如,IVAR可以跟踪对象状态,但这意味着对象的每个实例都更大,因为它们必须为该状态分配内存。所以,如果你的应用程序内存性能很重要,除非你需要,否则不应该使用IVAR。另一方面,静态变量有利于“一次性”——与对象状态无关的东西,但如果它们可以由多个线程上的多个对象写入,则通常必须加以保护。这些只是一些对比。。。还有很多其他的取决于你正在尝试做什么


关于
@synthesis
,您的最后一个问题是,不使用它只意味着该变量将不会有任何自动生成的访问器,这很好,因为该变量不是ivar,也不会与
MyController1
对象的实例相关联

这基本上是你的选择;看一看,;是的,使用实例变量会在某些方面有所损失,但如果您不需要KVC之类的东西,这很好。很抱歉发送垃圾邮件:但惯例是将实例变量前缀为“u”so“_myString”,作为替代方法,您可以在MyController1上拥有一个私有类别并声明一个“private”propertyPump在uu前缀的实例变量上执行制动。。。声明属性时,setter和getter会自动合成,如
propertyName=\u propertyName
。虽然编译器会让你声明以下划线开头的实例变量,但你只是在乞求混淆和调试问题的繁琐。在这个答案和这篇文章之间:我现在明白了我所做的事情的本质。谢谢