关于objective c:NSString(指针/非指针)赋值或保留

NSString (pointer/non pointer) assign or retain

我有四个相同的班。

指针、非指针、赋值与复制的组合。

使用每个案例的含义是什么?

1)

1
2
3
4
5
@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

2)

1
2
3
4
5
@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

3)

1
2
3
4
5
@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

4)

1
2
3
4
5
@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end


1)

1
2
3
4
5
@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

不能在堆栈上或作为对象实例变量分配NSObjects。在早期,Objective-C确实允许这样做,但现在不允许了。此代码不正确。

2)

1
2
3
4
5
@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

不能在堆栈上或作为对象实例变量分配NSObjects。在早期,Objective-C确实允许这样做,但现在不允许了。此代码不正确。

3)

1
2
3
4
5
@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

您保留了NSString实例中的所有权股份,保证在您保留该所有权时不会将其解除分配。由于NSMutableStringNSString的一个子类,因此在赋值时可能会给您一个可变字符串,因此其他代码可能会在您不知情的情况下修改字符串的值(除非您使用观察这些变化的键值)。出于这个原因,通常适合将copy语义用于您打算持有不可变值的属性(NSStringNSDataNSArrayNSSet是常见的(虽然不是确凿的)嫌疑人)。

4)

1
2
3
4
5
@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end

您没有保留字符串中的所有权权益,这意味着它可能在您不知情的情况下被解除。在引用计数环境中,这是委托属性的标准实践,因为保留它们可能会创建一个保留周期。负责解除分配字符串的代码必须在执行此操作之前(在引用计数的环境中)将apple属性设置为nil。在GC环境中,如果您的声明中有一个弱指针,那么您的分配将使字符串保持活动状态;如果您的声明中有一个弱指针,那么您的分配将使字符串保持零位(在dealloc中设置为0)。


据我所知,您应该始终使用NScReST保留或复制。指针(4)上的赋值将不会增加引用计数,因此将泄漏内存,或者说,这意味着当计数过早达到0时,最终会访问已释放的内存。

我不知道您是否可以使用nsstring作为本机类型。我总是用它作为指针。