是"分配"和"复制"?的含义相同

时间:2015-11-07 14:55:41

标签: objective-c

我知道assign应与原始变量一起使用,例如BOOLNSInteger。但我不知道assign的确切含义?

e.g。 (我的理解,也许不对)

@property (copy) NSString *strCopy;

@property (strong) NSString *strStrong;

@property (weak) NSString *strWeak;

NSString *anotherStr = @"abc";

self.strCopy = anotherStr;

self.strStrong = anotherStr;

self.strWeak = anotherStr;

strCopy = anotherStr表示strCopy获取数据" abc"在记忆中。

strStrong = anotherStr表示strStrong获取对当前数据" abc"的引用,以及" abc"的引用计数加1。

strWeak = anotherStr表示strWeak获取对当前数据" abc"的引用,但引用计数为" abc"不会改变。

另一个例子:

@property (assign) NSInteger myNumber;

NSInteger anotherNumber = 10;

self.myNumber = anotherNumber;

在此示例中,myNumber实际上获得了数据' 10'在记忆中。所以我认为assigncopy一样,是吗?

1 个答案:

答案 0 :(得分:2)

不,assigncopy不同,您只是将指针与非指针值混淆。

在Objective-C中,每个对象都使用指针表示。当您将对象指针分配给copy属性时,运行时将- copy发送到原始对象,并分配新内存(它可能不是优化,但我们假设它是这样)并且将新指针分配给支持该属性的实例变量。

因此复制了两件事:对象本身(一个新对象在内存中实例化,与旧对象不同),然后指定一个指向这个新对象的指针。

但是,对于assign属性,语言并不关心您是否有指向对象的指针或其他内容;它只是定期分配。它实际上只是分配(并因此“复制”)右侧的任何东西。如果它是一个指针,那很好 - 但是没有新的对象将被分配在内存中。