假设有一个局部变量分配如下
NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];
现在将此变量传递给对象定义的方法,例如 UISearchBar 对象的 setPlaceholder
[self.theSearchBar setPlaceholder:placeHolder];
如何以正确的方式释放分配的字符串 'placeHolder' ?
如果您想自动发布它:
NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease];
您的代码将因 bad_exc_access 而失败
如果您想在传递到其他地方后释放变量,例如
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release];
运行时异常也会抛出。
那么有什么问题呢?
问题是保留计数。UISearchBar 对象已分配,因此如果您释放或自动释放该对象引用的此类变量,则保留计数仍然相同
NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]);
[self.theSearchBar setPlaceholder:placeHolder];
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]);
那么,如何处理呢?
尝试以下内容
[placeHolder retain]; // retainCount +1
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release]; // retainCount -1
我们做了什么比?现在让我们看看保留计数
NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]);
[placeHolder retain]; // retainCount +1
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]);
因此,我们在将其分配(被引用)给某个对象之前增加了保留计数,并且 - 之后 - 我们在本地释放该变量。
就这样。