我开始使用Objective-C
和iOS
进行冒险,我有一件事,我不知道如何正确使用,这实际上是在吹我的心。
许多教程在.m
文件中都有私有类变量,如下所示:
@interface ViewController (){
@property (nonatomic, strong) NSMutableArray *myArray;
}
或者像这样:
@implementation ViewController
NSMutableArray *myArray;
@end
在第一个示例中,我可以使用_myArray
而不是我喜欢的self.myArray
,但是我应该将所有私有变量放在接口文件中吗?这两个变量之间的区别是什么?我何时应该使用一个而不是另一个,哪个更安全?
答案 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)
有几点想法:
第一个例子在语法上不正确。你可能意味着以下内容,它在declared property中定义了class extension:
_myArray
属性将:
合成一个名为@synthesize
的实例变量(或者如果指定myArray
指令,则可以控制此实例变量的名称);
合成访问器方法,值得注意的是检索值的setMyArray
getter和设置值的@implementation ViewController
NSMutableArray *myArray;
@end
setter;
提供其他功能,例如key-value coding等
另一方面,以下声明了一个全局变量:
@implementation ViewController
{
NSMutableArray *myArray;
}
@end
Globals是一个非常不同的野兽,在这个类的所有各种实例(以及整个应用程序)中共享。在这种情况下(类实例使用的一些可变数组),全局可能不是你想要的。
如果您打算定义实例变量,可以执行以下操作:
@implementation
或者,也许比在@interface
中定义这个ivar更好,人们通常会在类扩展名@interface ViewController ()
{
NSMutableArray *myArray;
}
@end
中定义它们:
{{1}}
我怀疑你实际上并不打算将全局变量与实例变量(ivar)或属性进行比较,而是要求在类实现中私下使用属性与ivar的基本原理:
使用ivars在特定类中的底线是一种完全可以接受的做法,但我们中的许多人使用类扩展中定义的私有属性。开销很小,它将代码从ivar的实现细节中抽象出来。例如,您可以在将来的某个日期自定义一个或多个访问器方法,并对类实现的其余部分产生最小的影响。但这是个人偏好的问题。
答案 3 :(得分:0)
@property
创建你的二传手和吸气剂而另一个则没有。
答案 4 :(得分:0)
是的,@property
会自动创建setter和getter。
另外,您可以设置属性的属性。 (只读/读写,非原子/原子,强/弱......等)
通过getter& amp;访问实例变量setter(而不是使用指针直接访问)使数据封装。
这是面向对象编程的常见和重要概念。
阅读本文以便理解。
抱歉英语不好。 :其中