我知道assign
应与原始变量一起使用,例如BOOL
,NSInteger
。但我不知道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'在记忆中。所以我认为assign
和copy
一样,是吗?
答案 0 :(得分:2)
不,assign
与copy
不同,您只是将指针与非指针值混淆。
在Objective-C中,每个对象都使用指针表示。当您将对象指针分配给copy
属性时,运行时将- copy
发送到原始对象,并分配新内存(它可能不是优化,但我们假设它是这样)并且将新指针分配给支持该属性的实例变量。
因此复制了两件事:对象本身(一个新对象在内存中实例化,与旧对象不同),然后指定一个指向这个新对象的指针。
但是,对于assign
属性,语言并不关心您是否有指向对象的指针或其他内容;它只是定期分配。它实际上只是分配(并因此“复制”)右侧的任何东西。如果它是一个指针,那很好 - 但是没有新的对象将被分配在内存中。