Cocoa touch 将静态字符串指定给属性,然后稍后释放它是否安全

Cocoa touch 将静态字符串指定给属性,然后稍后释放它是否安全,cocoa-touch,ios5,memory-management,modalviewcontroller,Cocoa Touch,Ios5,Memory Management,Modalviewcontroller,我正在更新我的一个应用程序,我发现了一些老代码,这让我大吃一惊。我的评论通常相当冗长,但我没有向自己解释我为什么这么做 我正在演示一个ModalView并更新标题和UITextField,如下所示: addStoryItem.placeholderText = @"Foo"; //The text is always a static string. addStoryItem.modalTitleText = @"Bar"; 在模态中,将为以下两个值指定特性: @property (read

我正在更新我的一个应用程序,我发现了一些老代码,这让我大吃一惊。我的评论通常相当冗长,但我没有向自己解释我为什么这么做

我正在演示一个ModalView并更新标题和UITextField,如下所示:

addStoryItem.placeholderText = @"Foo"; //The text is always a static string.
addStoryItem.modalTitleText  = @"Bar";
在模态中,将为以下两个值指定特性:

@property (readwrite, assign) NSString *placeholderText;
@property (readwrite, assign) NSString *modalTitleText;
然后在模式解除后,在模式的解除锁定中释放:

[placeholderText release];
[modalTitleText  release];

这安全/明智/正常吗?我想我可能对他做了这件事

你违反了几条规则:

  • 释放你所拥有的。(您不拥有assign属性。您只是侥幸逃脱了,因为释放字符串文字是一个nop)
  • 始终复制NSString属性。(赋值在这里非常危险,对象可能会消失。同样,不是文字。)

  • 您可以通过避免保留周期来证明这一点。但是,由于字符串(通常)不引用其他对象,因此循环在这里不是问题。

    您违反了一些规则:

  • 释放你所拥有的。(您不拥有assign属性。您只是侥幸逃脱了,因为释放字符串文字是一个nop)
  • 始终复制NSString属性。(赋值在这里非常危险,对象可能会消失。同样,不是文字。)

  • 您可以通过避免保留周期来证明这一点。但是,由于字符串(通常)不引用其他对象,因此循环在这里不是问题。

    对字符串使用“复制”属性,就可以了。在这种情况下,使用“分配”是错误的。也没有保留周期,因为字符串没有对控制器的拥有引用。(应该怎么做?)对字符串使用“copy”属性,这样就可以了。在这种情况下,使用“分配”是错误的。也没有保留周期,因为字符串没有对控制器的拥有引用。(他们应该怎么做?)