在iOS中不使用@property创建类本地引用可以吗?
在我的ViewController中,我创建了一些需要在控制器本身的各个位置使用的对象,但不在控制器之外。我是这样做的:在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
@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
。虽然编译器会让你声明以下划线开头的实例变量,但你只是在乞求混淆和调试问题的繁琐。在这个答案和这篇文章之间:我现在明白了我所做的事情的本质。谢谢