2014-02-28 67 views
1

在我的ViewController中,我创建了一些对象,我需要在控制器本身的各个地方使用,但是无处不在。我已经做了这样的:可以在iOS中创建类本地引用而不使用@property吗?

@implementation MyController1 

NSString *myString; 

- (void)myFirstMethod { 
    myString = @"hello world"; 
} 
... 
@end 

我没有把他们的头文件中也没有我在接口声明中,将像这样与@property定义他们:

@interface MyController1() 
    // could define myString with @property here 
@end 

我我没有任何问题与我的代码,但我想确保我没有违反安全的做法。我知道我可以将它们放在标题或实现文件中并使用@private,但为了简化代码,我没有。这可以吗?不再需要使用@synthesize对此有什么影响?

感谢,

+0

它基本上是你的选择;看一眼; http://stackoverflow.com/questions/11478038/reason-to-use-ivars-vs-properties-in-objective-c是的,你失去了一些使用实例变量的东西,但如果你不需要KVC和东西,它很好。 –

+0

对不起,垃圾邮件:但约定有实例变量前缀'_'所以'_myString'作为替代方案,您可以在MyController1上有一个私人类别,并声明一个“私人”属性 –

+0

泵_制动器_前缀实例变量...当你声明一个属性时,setter和getters会自动为你合成,如'propertyName = _propertyName'。虽然编译器会让你声明以下划线开头的实例变量,但你只是乞求混淆和调试问题而非常乏味。 –

回答

1

这是完全正常的,就像只要你知道一个实例变量(又名“成员变量”或“伊娃”)和静态变量之间的差异。例如,只会有你myString变量在这里你的榜样(@"hello world")相关一个字符串对象,无论创建了多少MyController1对象,每一个类MyController1的实例。所以这样,myString不像属性或实例变量。

此外,静态变量的生命周期更长 - 它将超过MyController1对象的所有实例,只有在程序退出时才会释放,或者您明确这样做,比如说如果您将它分配到堆上以开始(在@"hello world"的情况下,你并没有这样做,但当然可能会对其他静态变量起作用)。

这两种类型/方法都有优点和缺点。例如,ivars可以跟踪对象状态,但这意味着对象的每个实例都更大,因为它们每个都必须为该状态分配内存。因此,如果内存性能在您的应用程序中很重要,则不应使用ivars,除非您需要它们。另一方面,静态变量适用于“一次性” - 与对象状态无关的事物,但如果它们可以在多个线程上由多个对象写入,则通常必须受到保护。这些只是一些对比......根据你想要做的事情,还有很多其他的东西。

重新您的最后一个问题关于@synthesize,不使用它只是意味着不会对变量,这是很好的任何自动生成的访问,因为变量不是伊娃并没有随着MyController1的实例相关联反正是对象。

+0

在这个答案和这篇文章之间:http:// stackoverflow。com/questions/6143107/compiler-error-initializer-element-is-not-a-compile-time-constant现在我明白了我在做什么的真正本质。谢谢。 –

相关问题