cocoa - NSString stringWithCString : length: retain the byte array I pass in? 是否

标签 cocoa memory-management nsstring

我正在使用 AsyncSocket,其中 AsyncSocket 对象每当从远程端接收数据时都会调用下面的委托(delegate)方法:

- (void)onSocket:(AsyncSocket*)socket didReadData:(NSData*)data withTag:(long)tag;

现在,在这个方法中,我将 NSData 对象传递到以下命令中,以获取所接收数据的 NSString 表示形式:

NSString *body = [NSString stringWithCString:[data bytes] length:[data length];

NSString stringWithCString: length: 是否保留我传入的字节数组?我需要保留 NSData *data 吗?我需要在最后释放 NSString *body 吗?

谢谢。我想根据委托(delegate)方法获得正确的内存管理...

最佳答案

Does NSString stringWithCString: length: retain the byte array I pass in?

不可能保留字节数组。只能保留对象。

Do I need to retain the NSData *data?

没有。因为字符串无法保留数据(它不知道)或其内容,所以字符串将复制字节。 (想想如果你实现这个方法你会做什么:就是这样。)

让我们改变一下情况,看看如果您传入数据对象而不是字节,您会做什么。

如果字符串确实保留了数据,那么您无需担心数据会从字符串下方消失,因为字符串正在保留数据。如果它不保留它,则该字符串要么制作了自己的副本,要么根本不保存您的数据。

所以其他对象的保留并不重要。别担心他们。只关心谁拥有什么,并相应地保留或不保留。

Do I need to be releasing NSString *body at the end?

好吧,你没有保留它,你没有分配它,你也没有复制它。因此,您不拥有它。所以,不。

如果您确实想获得该对象的所有权,您可以保留它或制作(然后拥有)自己的副本。然后你就释放它。

关于cocoa - NSString stringWithCString : length: retain the byte array I pass in? 是否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/938408/

相关文章:

cocoa - 在 CoreData 对象上保存观察者的干净方法?

xcode - 如何强制应用程序以隐藏模式启动? (Mac 登录应用程序)

swift - 为什么设置约束后无法再调整 NSWindow 的大小?

iphone - 是什么导致内存泄漏?

c - 嵌入式系统上的 malloc 行为

c++ - 如何为比对象所有者生存时间短的类组织对象所有权?

ios - NSDictionary 到 NSString 不工作

使用 NSXml 文档解析 Xml

iphone - 使用 NSString 类型的表达式初始化 NSMutableString 的指针不兼容 - 警告

ios - 如何在 iPhone 中使用 Base64 解码字符串