超越NARC:何时保留,何时分配,何时复制

Dan*_*ark 3 memory-management objective-c narc

我终于明白我是否必须释放一个对象,以及如何在一个简单的应用程序中保持我的保留计数尽可能低(通过知道该对象是否带有一个额外的'retain'已经被调用).因此,NARC规则在这方面运作良好.

另一方面,我不能围绕是否retain(通常使用保留属性)或只是assign实例变量.那里有经验法则吗?我只知道两个:

  1. 如果我在我的类中创建了实例(例如,在init中),那么我应该保留它并在其中释放它dealloc.
  2. 代表被分配,而不是保留

但我不明白的是我是否应该保留我从另一个实例传递的东西.我知道风险是保留计数降到零并且我留下了包(或者留下了许多额外的包和内存),但是......我应该如何组织我的应用程序以便不会发生这种情况?

我看过一些相关的问题,但没什么大不了的.

我在这里的时候:那些已添加到我UIWindow或未UIView亲自保留的内容中的内容如何?如果他们的超级视图从所有超级视图中删除,"自然"保留的实例是否会被取消分配?

Geo*_*che 10

对于类型对象,您希望:

  • retain 默认情况下
  • copy 如果该类来自可变/不可变类集群
  • assign如果你需要弱引用

至于清理,所有retaincopy属性都需要released.

如果我在我的类中创建了实例(例如,在init中),那么我应该保留它并在dealloc中释放它.

问题不在于它是否是在你班级的方法中创建的,而是你是否:

  • 想要强烈引用一个实例
  • 已经拥有它

如果您还没有拥有它并想要强烈引用它,请保留 - 对于传递给您的方法的实例也是如此.无论是通过setter显式还是隐式保留都无关紧要.