iOS澄清中的强弱属性

时间:2014-05-21 08:34:50

标签: ios objective-c memory-management

NSString *strongObj = [[NSString alloc] init]; //alloc and initialze a new instance
strongObj = @"some value"; //set value to a instance
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj

strongObj = nil; //set strong object to nil and remove it from memory

strongObj = @"some value 2"; //assign a  different value to strong obj

weakObj ; // weak obj still holds  // @"some value" // this value event i've set the week obj pointer to nil

请看上面的代码和评论,评论是我的观点/假设。请澄清一下。

谢谢

2 个答案:

答案 0 :(得分:0)

字符串文字始终处于活动状态,并且永远不会在运行时释放。当指向的内存被释放时,弱指针无效,因此您错误地期望您的weakObj无效。

要使它工作,而不是文字字符串,你应该使用

[[NSString alloc] initWithFormat:@"some value %d", 1];

即克。

NSString *strongObj = [[NSString alloc]  initWithFormat:@"some value %d", 1]; //alloc and initialze a new instance
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj

strongObj = nil; //set strong object to nil and remove it from memory

weakObj ; 

答案 1 :(得分:0)

虽然您正在创建strongObj实例,但实际上您并未使用相同的实例,而是将指针重新分配给字符串文字@"some value",无论地址是什么。它绝不是您在代码的第一行分配的相同实例。

现在,当您指定weakObj时,您实际上会将其指向相同的字符串文字@"some value"

基本上发生的是weakObj不跟随strongObj,但它跟在字符串文字后面,而不是取消分配。这就是为什么当strongObj设置为nil时,您仍然会看到"某些值"

相关问题