Objective c 如果某个属性的值被覆盖,该属性会发生什么情况?
假设我创建了一个NSString类型的属性tempStr。 显然是我合成的 在我的一个方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后,我用redcolor重新初始化了tempStr 所以我想知道在这种情况下tempStr的内存会发生什么变化Objective c 如果某个属性的值被覆盖,该属性会发生什么情况?,objective-c,memory-management,nsstring,properties,Objective C,Memory Management,Nsstring,Properties,假设我创建了一个NSString类型的属性tempStr。 显然是我合成的 在我的一个方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后,我用redcolor重新初始化了tempStr 所以我想知道在这种情况下tempStr的内存会发生什么变化 Thanx.合成setter看起来有点像这样: - (void)setSomeString:(NSString *)newString { if ([newString isEqualToString:someString
Thanx.合成setter看起来有点像这样:
- (void)setSomeString:(NSString *)newString
{
if ([newString isEqualToString:someString]) return;
[someString autorelease];
someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}
因此,当将新值分配给指针时,旧值将被释放。这取决于您为属性设置的属性:
retain
、assign
或copy
:旧值(黄色)将被释放,新值(红色)将被保留。唯一的例外是@property(retain)NSString*tempStr
时。然后什么也不会发生,因为旧的和新的价值观是相同的yellowcolor==redcolor
:不会有释放/保留操作。这相当于只更改一个指针。因此,在此操作之后,yellowcolor将不会被释放,并且您将丢失对它的引用(如果代码中没有对它的其他引用)。因此,它可能会导致内存泄漏@property(assign)NSString*tempStr
:它类似于@property(copy)NSString*tempStr
,但它在新值上调用retain
,而不仅仅是copy
,因此它会在内存中创建一个重复的对象。考虑到NSString,它等于retain
,因为NSString是不可变的,所以不需要复制retain
编辑:如@bavaried所述,
copy
仅当您使用NSString
初始化此属性时,才等于retain
。如果您使用NSMutableString
初始化它,它将不相等,因为这一个是可变的,因此将生成“正确的”副本。请注意,NSString
属性可以指定为NSMutableString
对象,在这种情况下,copy
不会充当retain
。