首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多分配和零指针分配内存概念

多分配和零指针分配内存概念
EN

Stack Overflow用户
提问于 2014-01-14 17:23:00
回答 2查看 253关注 0票数 1
  1. 当我多次分配init对象时会发生什么?

例如:

代码语言:javascript
运行
复制
{
  nssstring * samplestring ;
  samplestring = [[nsstring alloc]init];
  samplestring = [[nsstring alloc]init];
}

在这个代码block执行之后,采样字符串在第一次分配时所指向的内存地址是否是一个泄漏?

这是正常的还是错误的编码实践。此块执行后ARC如何处理第一次内存分配。

2.上述代码与

代码语言:javascript
运行
复制
{
  nssstring * samplestring;
  samplestring = [[nsstring alloc]init];
  samplestring = nil;
}

Nil是一个对象。对吧?因此,在这里,第一个samplestring内存分配似乎与1中的代码块类似,或者nil在内存管理方面有特殊的意义。

最后,如果我想使用相同的对象名称,应该遵循1或2。

我是从我的手机问这个问题,所以请原谅格式化,以防这是一个副本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 17:32:18

如果您正在使用ARC,那么这两种情况中的任何一种都没有泄漏。

在第一个示例中,您创建了一个指针。然后在内存中创建一个对象,并告诉指针指向它。然后在内存中创建另一个对象(位于不同的内存位置),并告诉指针指向它。弧线将看到没有任何指向第一个分配,并标记为垃圾和可重用的内存位置。根据对象的指向或不指向( retian计数为1或更多),are为您添加retain]release调用。

您的第二个例子几乎是一样的。创建一个指针。然后创建一个对象并让指针指向它。然后让指针指向零(零)。在这一点上,您没有指向您创建的内存位置,ARC看到这一点,并将内存标记为垃圾/可重用。

在某些方面,第二个示例更好,因为当您使用xcode运行analyze时,它会看到您将指针设置为零,如果没有重新分配,那么它的任何进一步使用都将被标记为错误(如果它们最初不会导致应用程序崩溃)。但这真的是个意见问题。

票数 1
EN

Stack Overflow用户

发布于 2014-01-14 17:29:17

对于1,当重新分配对象指针时,ARC将销毁旧对象.同样,如果该对象超出范围,它将被销毁。

代码语言:javascript
运行
复制
{
    NSString * samplestring ;
    samplestring =[ [nsstring alloc]init];    // first object created
    samplestring =[ [nsstring alloc]init];    // first destroyed, second created
}    // second object destroyed

对于2,这是一个几乎相同的故事,除了当符号超出范围时没有什么可摧毁的:

代码语言:javascript
运行
复制
{
    NSString * samplestring;
    samplestring =[ [nsstring alloc]init];    // first object created
    samplestring =nil;                        // first object destroyed
}

最后,如果我想使用相同的对象名,应该遵循1或2。,这并不重要,但是2是多余的,因为ARC将正确地管理对象的生存期。

最后,nil不是一个对象,它是一个零指针,即指向任何东西的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21119863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档