gpt4 book ai didi

iphone - 为什么需要保留 NSString 变量?

转载 作者:行者123 更新时间:2023-12-03 20:26:13 25 4
gpt4 key购买 nike

我的 .h 文件中有以下代码:

@interface Utils : NSObject {
NSString *dPath;
}
@property(nonatomic, retain) NSString *dPath;

在我的 .m 文件中:

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];
[dPath retain];

如果它已经定义为(非原子,保留),为什么我必须保留dPath?如果我不添加 [dPath keep];在其他函数中使用此变量时,我遇到一些奇怪的随机错误,并且应用程序崩溃。我猜这是因为某个地方有一些自动释放,但我没有。

那么,(非原子,保留)到底在做什么? [dPath keep] 真的有必要吗?或者我只是隐藏了其他东西?

最佳答案

因为代码没有调用 dPath 属性的 setter 方法,它只是直接设置实例变量 dPath:

dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];
[dPath retain];

所以必须手动保留。

如果像这样使用属性 setter ,您将能够(实际上您需要)省略 retain 调用(注意 self.):

self.dPath = [[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName];

或者像这样(注意setDPath:):

[self setDPath:[[documentPaths objectAtIndex:0] stringByAppendingPathComponent:kDatabaseName]];

setter 会为您保留 NSString,因此您不必自己执行此操作。

<小时/>

为了避免混淆,一个不错的小做法是在你的 ivar 名称后面添加一个下划线以表明它是一个 ivar:

    NSString *dPath_;

然后像这样综合你的属性,将其与你的不同名称的 ivar 关联起来:

// self.dPath is the property, dPath_ is the ivar
@synthesize dPath = dPath_;

然后修改您的 dealloc 方法以及直接引用实例变量的任何其他代码,以改用附加名称:

- (void)dealloc {
[dPath_ release];

[super dealloc];
}

关于iphone - 为什么需要保留 NSString 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905511/

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