Objective c 我应该释放我没有创建的NSString实例吗?

Objective c 我应该释放我没有创建的NSString实例吗?,objective-c,nsstring,Objective C,Nsstring,例如,字符串是从NSDictionary返回的,而NSDictionary又从文件系统读取该字符串。 所以,我们不知道字符串是通过[NSString stringWith…]还是[[NSString alloc]initWith…]或任何其他方式创建的 若API并没有提到返回的对象,你们通常如何知道你们是否负责释放它 PS我在这里看到过类似的问题,但大多数问题都涉及常量@或显式创建的字符串。不,您应该只发布已分配、保留、复制或新建的实例。不,您应该只发布已分配、保留的实例,复制或新建。Objec

例如,字符串是从NSDictionary返回的,而NSDictionary又从文件系统读取该字符串。 所以,我们不知道字符串是通过[NSString stringWith…]还是[[NSString alloc]initWith…]或任何其他方式创建的

若API并没有提到返回的对象,你们通常如何知道你们是否负责释放它


PS我在这里看到过类似的问题,但大多数问题都涉及常量@或显式创建的字符串。

不,您应该只发布已分配、保留、复制或新建的实例。

不,您应该只发布已分配、保留的实例,复制或新建。Objective-C经验法则:如果您的代码执行alloc/copy/retain来初始化对象,那么您需要释放它,因为您是对象的所有者。如果不执行alloc/copy/retain来初始化对象(例如使用方法获取实例),则您不是所有者,不应释放该对象


在本例中,您没有创建字符串,因此您不负责释放它。您不必担心字符串在创建并添加到NSDictionary时是如何初始化的,除非您自己创建并添加到字典中。对于大多数集合对象,它们拥有添加到它们中的对象的所有权,因此它们负责释放它们管理的对象

Objective-C经验法则:如果代码执行alloc/copy/retain来初始化对象,那么您需要释放它,因为您是对象的所有者。如果不执行alloc/copy/retain来初始化对象(例如使用方法获取实例),则您不是所有者,不应释放该对象


在本例中,您没有创建字符串,因此您不负责释放它。您不必担心字符串在创建并添加到NSDictionary时是如何初始化的,除非您自己创建并添加到字典中。对于大多数集合对象,它们拥有添加到它们中的对象的所有权,因此它们负责释放它们管理的对象

请参阅。如果您只能阅读文档的一部分,那么这就是一个:还有静态分析器构建→ 构建和分析内存管理规则非常好,它应该能够捕获您错过的内容。

请参阅。如果您只能阅读文档的一部分,那么这就是一个:还有静态分析器构建→ 构建和分析内存管理规则非常好,它应该能够捕获您错过的内容。

字典的成员通过-objectForKey:访问,因此您不负责释放它们。字典是本例中您直接创建的唯一对象。如果您是通过alloc、copy或新方法(如[NSDictionary alloc]initWithContentsOfFile:…])执行此操作的,则必须将其释放。如果它来自其他地方,包括[NSDictionary dictionary…]工厂之一,则您没有对它的引用,也不需要发布它。

字典的成员通过-objectForKey:访问,因此您不负责发布它们。字典是本例中您直接创建的唯一对象。如果您是通过alloc、copy或新方法(如[NSDictionary alloc]initWithContentsOfFile:…])执行此操作的,则必须将其释放。如果它来自其他地方,包括[NSDictionary dictionary…]工厂之一,您没有对它的引用,也不需要发布它。

因此,我不需要管理从另一个方法获得的任何对象,对吗?仅当该方法的名称包含/开始于copy、new等。如果您不确定,在使用前保留它,并在使用完毕后立即释放。这只会导致您应该释放它们的对象泄漏。因此,我不需要管理从另一个方法获得的任何对象,对吗?仅当该方法的名称包含/开始于copy、new等。如果您不确定,使用前请保留,用完后立即释放。这只会导致本应释放的物体泄漏。+1感谢您的解释!如果我们扩展您的示例,我从字典中取出字符串,将其保留为对象的属性并处理字典,难道不会破坏这个模型吗?Dictionary是所有者,但它已经不存在了。模型有点不合适,因为您不必使用retain来初始化对象,您还可以使用retain对现有对象承担责任。这正是你使用字典的例子——当你保留时,你有责任发布。就像驯服狐狸一样:+1谢谢你的解释!如果我们扩展您的示例,我是否可以从字典中取出字符串,将其保留为对象的字符串
属性和字典是否破坏此模型?Dictionary是所有者,但它已经不存在了。模型有点不合适,因为您不必使用retain来初始化对象,您还可以使用retain对现有对象承担责任。这正是你使用字典的例子——当你保留时,你有责任发布。就像驯服狐狸一样:其他答案似乎过于简单,但本文非常有用,谢谢!其他答案似乎过于简化了,但这篇文章真的很有用,谢谢!