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
正在对对象调用getter方法self.myArray
- 使用
使变量通过其设置器,因此在未使用ARC时释放对象self.myArray=nil
- 如果属性是用
原子的
(默认值)声明的,这意味着访问变量是线程安全的,并且性能是有代价的
property意味着当从多个线程访问变量或属性时,可能会发生争用情况nonatomic
- 如果属性是用
通常,对于与多个线程共享的对象使用
原子的,对于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<