Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios interface Object(){}和@implementation Object@end中变量之间的差异_Ios_Objective C - Fatal编程技术网

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

Ios interface Object(){}和@implementation Object@end中变量之间的差异,ios,objective-c,Ios,Objective C,我从Objective-C和iOS开始我的冒险,我有一件事我不知道如何正确使用,这简直让我大吃一惊 许多教程在.m文件中都有私有类变量,定义如下: @interface ViewController (){ @property (nonatomic, strong) NSMutableArray *myArray; } @implementation ViewController NSMutableArray *myArray; @end 或者像这样: @interf

我从
Objective-C
iOS
开始我的冒险,我有一件事我不知道如何正确使用,这简直让我大吃一惊

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

@interface ViewController (){
    @property (nonatomic, strong) NSMutableArray *myArray;
}
@implementation ViewController
        NSMutableArray *myArray;
@end
或者像这样:

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

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

@property
创建设置器和获取器,而另一个不创建

@property
创建您的setter和getter,而另一个不创建

区别在于:

  • \u myArray
    是实例变量

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

  • 使用
    self.myArray=nil
    使变量通过其设置器,因此在未使用ARC时释放对象

    • 如果属性是用
      原子的
      (默认值)声明的,这意味着访问变量是线程安全的,并且性能是有代价的
    • nonatomic
      property意味着当从多个线程访问变量或属性时,可能会发生争用情况

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

区别在于:

  • \u myArray
    是实例变量

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

  • 使用
    self.myArray=nil
    使变量通过其设置器,因此在未使用ARC时释放对象

    • 如果属性是用
      原子的
      (默认值)声明的,这意味着访问变量是线程安全的,并且性能是有代价的
    • nonatomic
      property意味着当从多个线程访问变量或属性时,可能会发生争用情况

一般来说,对于多线程共享的对象使用
原子的
,对于UI或非共享对象使用
非原子的

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

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

通过getter和setter访问实例变量(而不是使用指针直接访问)可以封装数据

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

读这篇文章来理解


对不起,英语不好 是的,
@property
自动创建setter和getter

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

通过getter和setter访问实例变量(而不是使用指针直接访问)可以封装数据

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

读这篇文章来理解


对不起,英语不好 注意,您的代码将出现编译器错误:

@interface ViewController (){
    @property (nonatomic, strong) NSMutableArray *myArray;
}
->您必须移动@property。。。在头的{}之外

@interface ViewController (){
    //
}

@property (nonatomic, strong) NSMutableArray *myArray;

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

@interface ViewController (){
    @property (nonatomic, strong) NSMutableArray *myArray;
}
->您必须移动@property。。。在头的{}之外

@interface ViewController (){
    //
}

@property (nonatomic, strong) NSMutableArray *myArray;
有几点想法:

  • 第一个例子在语法上不正确。您可能是指以下内容,其中定义了

    财产将:

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

    • 综合访问器方法,注意检索值的
      myArray
      getter和设置值的
      setMyArray
      setter

    • 提供其他功能,例如,等

  • 另一方面,下面声明了一个全局变量:

    @implementation ViewController
    NSMutableArray *myArray;
    @end
    
    Globals是一个非常不同的beast,在这个类的所有实例中(以及在整个应用程序中)共享。在这种情况下(类实例使用的一些可变数组),全局数组可能不是您想要的

  • 如果要定义实例变量,可以执行以下操作:

    @implementation ViewController
    {
        NSMutableArray *myArray;
    }
    @end
    
    或者,可能比在
    @实现中这样定义这个ivar更好,通常在类扩展的
    @接口中定义它们:

    @interface ViewController ()
    {
        NSMutableArray *myArray;
    }
    @end
    
  • 我怀疑您实际上并不打算将全局变量与实例变量(ivar)或属性进行比较,而是询问在类实现中私下使用属性与ivar的理由:

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

    有几点想法:

  • 第一个例子在语法上不正确。您可能是指以下内容,其中定义了

    财产将:

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

    • 综合访问器方法,注意检索值的
      myArray
      getter和设置值的
      setMyArray
      setter

      <