gpt4 book ai didi

objective-c - NSString 属性和自定义初始化

转载 作者:太空狗 更新时间:2023-10-30 03:48:34 26 4
gpt4 key购买 nike

我有 2 个问题。

首先 - 字符串是否在 obj-c 中如此声明

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *city;

那些 (nonatomic, copy) 是正确的还是我应该使用 (nonatomic, strong) 或其他东西?

其次 - 如果我想为上述字符串设置自定义初始化程序,我是否使用

-(id)initWithName:(NSString *)n andCity:(NSString *)c
{
self = [super init];
if (self) {
self.name = n;
self.city = c;
}
}

或者我应该使用:

-(id)initWithName:(NSString *)n andCity:(NSString *)c
{
self = [super init];
if (self) {
self.name = [n copy]
self.city = [c copy];
}
}

正如我所看到的,这两种方法似乎都适用于这两个问题,但我确定一种方法比另一种方法更正确,所以我想问一下我应该使用哪种方法在以后的项目中编写正确的代码。

谢谢。

最佳答案

您想对值语义类型的属性使用copy。 (其中 NSString 始终是一个。)否则,我可以将 NSMutableString 的实例传递给您,然后在事后从您的下方更改它。不可变对象(immutable对象)将通过执行 return [self retain] 实现 -copyWithZone:;以免在不需要时实际创建第二个副本。另请参阅:NSString property: copy or retain?

就您的 -init 方法而言,您希望避免像现有的那样使用属性 setter ,因为它们可能会在子类中被覆盖以执行您的类无法预见的事情。所以假设默认的 auto-ivar-synthesis 命名模式,你会想要这样做:

-(id)initWithName:(NSString *)n andCity:(NSString *)c
{
if (self = [super init])
{
_name = [n copy];
_city = [c copy];
}
return self;
}

这是一个微妙的事情,它通常不会成为问题,但是如果你继续在 -init-dealloc 方法中使用 inherently-virtual property setter ,在足够长的时间线内,你被这个烧伤(你能告诉我我已经被这个烧伤了吗?)

至于泄漏的内存,如果您使用的是 ARC,当 foo 是一个 copy 属性时,执行类似 self.foo = [bar copy]; 的操作 导致副本被调用两次,并且可能会生成两个副本,但 ARC 应该注意正确释放冗余/中间副本,并且应该不会发生内存泄漏。

关于objective-c - NSString 属性和自定义初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com