接口Object(){}和@implementation Object @end中变量之间的差异

时间:2014-07-31 08:36:47

标签: ios objective-c

我开始使用Objective-CiOS进行冒险,我有一件事,我不知道如何正确使用,这实际上是在吹我的心。

许多教程在.m文件中都有私有类变量,如下所示:

@interface ViewController (){
    @property (nonatomic, strong) NSMutableArray *myArray;
}

或者像这样:

@implementation ViewController
        NSMutableArray *myArray;
@end

在第一个示例中,我可以使用_myArray而不是我喜欢的self.myArray,但是我应该将所有私有变量放在接口文件中吗?这两个变量之间的区别是什么?我何时应该使用一个而不是另一个,哪个更安全?

5 个答案:

答案 0 :(得分:5)

区别在于:

  • _myArray是实例变量。

  • self.myArray正在对象上调用getter方法。

  • 使用self.myArray = nil会使变量通过其setter,因此在ARC >时释放对象。

    • 如果声明属性为atomic(默认值),这意味着访问变量是线程安全的,性能成本
    • nonatomic属性表示从多个线程访问变量或属性时可能发生竞争条件。

通常,对于与多个线程共享的对象使用atomic,对于UI或非共享对象使用nonatomic

答案 1 :(得分:2)

注意,您的代码会出现编译错误:

@interface ViewController (){
    @property (nonatomic, strong) NSMutableArray *myArray;
}

- >你必须在标题的{}之外移动@property ...

@interface ViewController (){
    //
}

@property (nonatomic, strong) NSMutableArray *myArray;

答案 2 :(得分:1)

有几点想法:

  1. 第一个例子在语法上不正确。你可能意味着以下内容,它在declared property中定义了class extension

    _myArray

    属性将:

    • 合成一个名为@synthesize的实例变量(或者如果指定myArray指令,则可以控制此实例变量的名称);

    • 合成访问器方法,值得注意的是检索值的setMyArray getter和设置值的@implementation ViewController NSMutableArray *myArray; @end setter;

    • 提供其他功能,例如key-value coding

  2. 另一方面,以下声明了一个全局变量:

    @implementation ViewController
    {
        NSMutableArray *myArray;
    }
    @end
    

    Globals是一个非常不同的野兽,在这个类的所有各种实例(以及整个应用程序)中共享。在这种情况下(类实例使用的一些可变数组),全局可能不是你想要的。

  3. 如果您打算定义实例变量,可以执行以下操作:

    @implementation

    或者,也许比在@interface中定义这个ivar更好,人们通常会在类扩展名@interface ViewController () { NSMutableArray *myArray; } @end 中定义它们:

    {{1}}
  4. 我怀疑你实际上并不打算将全局变量与实例变量(ivar)或属性进行比较,而是要求在类实现中私下使用属性与ivar的基本原理:

    使用ivars在特定类中的底线是一种完全可以接受的做法,但我们中的许多人使用类扩展中定义的私有属性。开销很小,它将代码从ivar的实现细节中抽象出来。例如,您可以在将来的某个日期自定义一个或多个访问器方法,并对类实现的其余部分产生最小的影响。但这是个人偏好的问题。

答案 3 :(得分:0)

@property创建你的二传手和吸气剂而另一个则没有。

答案 4 :(得分:0)

是的,@property会自动创建setter和getter。

另外,您可以设置属性的属性。 (只读/读写,非原子/原子,强/弱......等)

通过getter& amp;访问实例变量setter(而不是使用指针直接访问)使数据封装。

这是面向对象编程的常见和重要概念。

阅读本文以便理解。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

抱歉英语不好。 :其中