我应该发布这个NSString吗?

ice*_*ace 0 cocoa objective-c

伙计们:请帮忙.我有一个实用程序类来返回带编码的NSString.像这样:

/*Get a NSString with chinese encoding*/
+(NSString*) getGBKString:(void *)buffer
{
  NSString* string = [[[NSString alloc] 
                      initWithBytes:buffer 
                        length:sizeof(buffer) 
                        encoding:kCFStringEncodingGB_18030_2000] 
                      autorelease];

  return string;
}
Run Code Online (Sandbox Code Playgroud)

autorelease是正确的事情吗?

如果是这样,方法调用者应该调用retain incase NSString对象被释放?

ken*_*ytm 6

autorelease是正确的事情吗?

是.由于该方法不包含+alloc/ new/ copy,为了遵循Cocoa内存管理规则,您应该返回一个没有所有权的对象.

或者,您可以将方法重命名为+newGBKString:和删除-autorelease,然后知道约定的人将知道调用者将获得所有权.

如果是这样,方法调用者应该调用retain incase NSString对象被释放?

调用者应该-retain保留NSString.

  • @icespace:`-autorelease`基本上是"稍后发布".当你调用`-autorelease`时,所有权将被转移到一个自动释放池,当运行循环滴答时它将"释放"它.效果就像返回保留计数0的"垂死"对象(但仍然有效). (3认同)
  • 只有在自动释放池耗尽后,保留计数才会降至0. (2认同)