答案其实很简单:当你需要值语义(值语义是指一个对象被系统标准的复制方式复制之后,与被复制的对象之间毫无关系,彼此独立改变且互不影响)的时候使用结构体,当你需要引用语义(引用语义是指一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对其中一个的改变都将影响到另外一个)的时候使用类。就是这样!
欢迎下周再来。。。
等等!
怎么了?
这没有回答这个问题
什么意思?就是这样的啊!
是的,但是。。。
但是什么?
什么是值语义和引用语义呢?
哦,这个啊。也许我接下来应该讲讲这个。
并且他们怎么和结构体和类相关联的呢?
好的。
所有的问题都归结于数据和数据被存储在什么地方。我们通常将数据存在在局部变量、参数、属性以及全局变量中。从根本上说有两种不同的方法将数据存储在所有这些地方。
值语义中,数据直接存在于被存储的位置。引用语义中,数据存在于别的地方,而存储的位置中存储着一个对数据的引用。当你获取数据的时候这种差别可能不那么明显。而当你拷贝那块存储区域时这种不同就会显现出来。值语义中,你会获的原数据的一个新拷贝,而引用语义下,你会获的同样数据的引用的一个新拷贝。
这真的很抽象。让我们来看一个例子,暂时把 Swift 的这个问题从你脑海中移除,让我们来看一个 Objective-C 的例子:
@interface SomeClass : NSObject
@property
int number;
@end
@implementation SomeClass
@end
struct SomeStruct {
int number;
};
SomeClass *reference = [[SomeClass alloc] init];
reference.number =
42;
SomeClass *reference2 = reference;
reference.number =
43;
NSLog(
@"The number in reference2 is %d", reference2.number);
struct SomeStruct value = {};
value.number =
42;
struct SomeStruct value2 = value;
value.number =
43;
NSLog(
@"The number in value2 is %d", value2.number);\
|
打印结果:
The number
in reference2 is
43
The number
in value2 is
42
|
为什么会有这样的差异呢?
代码SomeClass *reference = [[SomeClass alloc] init]
在内存中创建了一个新的