我在宣布一个NSString属性的类和Objective-C的抱怨:的NSString没有“分配”,“保留”或“复制”属性指定
的NSString没有“分配”,“保留“或”复制“属性被指定为
然后随便让我知道”分配被用来代替“。
有人能向我解释之间的差额分配,在普通的C内存管理功能方面保留和副本?
我在宣布一个NSString属性的类和Objective-C的抱怨:的NSString没有“分配”,“保留”或“复制”属性指定
的NSString没有“分配”,“保留“或”复制“属性被指定为
然后随便让我知道”分配被用来代替“。
有人能向我解释之间的差额分配,在普通的C内存管理功能方面保留和副本?
我认为这是提请你注意的事实,正在使用assign
,而不是retain
或copy
。由于NSString
是一个对象,因此在引用计数的环境中(即没有垃圾收集),这可能是潜在的“危险”(除非它是有意设计的)。
然而,assign
,retain
和copy
之间的区别如下:
分配:在该属性的setter方法,还有就是你的实例变量的简单分配到新的价值例如:
- (void)setString:(NSString*)newString
{
string = newString;
}
这可以通过不保留该对象会导致问题,因为Objective-C对象使用引用计数,并且因此,有机会该字符串可以在您仍在使用时释放。
保留:此保留在setter方法的新值。例如:
- (void)setString:(NSString*)newString
{
[newString retain];
[string release];
string = newString;
}
这是比较安全的,因为你明确说明要保持对象的引用,你必须释放它,它就会被释放之前。
副本:这使得该字符串的一个副本在你的setter方法:
- (void)setString:(NSString*)newString
{
if(string!=newString)
{
[string release];
string = [newString copy];
}
}
这通常被用来处理字符串,因为制作原始对象的副本,确保它不会改变,而你正在使用它。
Cocoa使用引用计数来管理内存。引用计数为0的对象被删除。
更多细节here,在苹果自己的文档。
assign
- ivar通过做一个简单的任务设置。执行:
- (void) setFoo:(NSString *)newFoo {
foo = newFoo;
}
retain
- 伊娃在做任务之前发送的保留消息。执行:
- (void) setFoo:(NSString *)newFoo {
if (foo != newFoo) {
[foo release];
foo = [newFoo retain];
}
}
copy
- ivar在进行分配前发送复制消息。实现:
- (void) setFoo:(NSString *)newFoo {
if (foo != newFoo) {
[foo release];
foo = [newFoo copy];
}
}
这些不是实际实施方式中,编译器@synthesizes,但是从(非GC)存储器管理透视演示行为。 – 2009-11-02 18:19:09
@尼古拉 - 是的,谢谢澄清。 – 2009-11-02 18:22:32
retain - __even if__ someone [deallocs]你正在引用的NSString?或者只有同一个实例的每个用户[发布]才能工作? – bobobobo 2009-11-02 18:23:43
@bobobobo - 你应该*不要*调用'dealloc'自己。你应该总是使用'release'或'autorelease'。 – 2009-11-02 18:24:38
戴夫说什么。您的数据得到保证的原因是因为您认为其他人只使用版本,仅通过引用降低引用计数。如果其他人,或者你自己,通过dealloc或释放一个对象(从而不遵守规则),你的数据不能保证! – bmalicoat 2009-11-02 18:28:48