gpt4 book ai didi

objective-c - 在常量和非常量字符串之间交替时 NSString 的最佳分配

转载 作者:行者123 更新时间:2023-12-03 16:41:46 24 4
gpt4 key购买 nike

我需要一些帮助来更好地理解 Cocoa 中字符串的内存特性。我正在使用的应用程序使用一个 View Controller 和 n 个工具对象。 View Controller 随着程序的生命周期而存在,但工具对象会被分配和释放。

假设我有一个字符串toolName_,并且在我的实现中我配置传入的工具对象:如果该对象没有工具名称,我想将toolName_字符串设置为@“not set”。如果该工具有名称,我想将字符串设置为该工具的名称。

我想知道将传入值存储到 toolName_ 中的正确方法,因为有时这将是一个分配的对象,有时这将是一个常量字符串。

-(BOOL)setToolObject: ToolObject: obj{

ToolObject someObj = nil;
someObj = [[ToolObject alloc]initWithObject obj];

if(someObj != nil){

if(! [someObj.toolName isEqualToString: @""]){

self->toolName_ = Which method should I use given the above question?
The last instance may have been a constant string but may not have.
[self->toolName_ release] (can I send a release message to a constant
string without causing a problem?)
self->toolName = [[NSString alloc]initWithString:someObj.toolName];

OR

self->tool name = [NSString stringWithString: someObj.toolName];
This method is self releasing but I don't own it and I'm still not sure
what happens to the constant string if it existed. I think I read it's
not recommended to use this on member vars.

}else{

self->toolName_ = @"not set";
}

return YES;

}else{

return NO;
}

}

感谢您的建议。

最佳答案

我强烈建议(可能)使用 ARC,如果您不能使用它(或者您可能只是想了解内存管理如何工作?),请不要从类外部发送保留和释放消息。相反,您应该在访问器中执行此操作。

因此,您应该创建一个保留或复制属性(通常使用不可变字符串比使用复制更好,因为它们可能被分配给可变字符串,因此使您正在使用不可变(因此线程安全)属性的假设无效)。

因此,对于您的情况,我建议像这样的 setter :

- (void) setToolName: (NSString*) toolName
{
if(_toolName== toolName)
return;
[_toolName release];
_toolName= [toolName copy];
}

这样你就可以做得很好,你不应该关心setter参数的保留计数是多少。如果它是一个具有未知保留计数的字符串文字,则该对象甚至不响应释放消息,因此它将对所有程序保持事件状态(不像它看起来很高效,因为它避免了创建对象的开销在运行时)。如果您复制一个不可变对象(immutable对象)(除非它类似于缓存的 NSNumber 或字符串文字),则代码仅执行简单的赋值,并且保留计数会增加。

因此,如果您遵循“我保留(或复制)我需要使用的内容,我释放我不再需要使用的内容”的规则,那么您就做得很好,您不应该担心在特殊情况下会发生什么,比如字符串文字。

关于objective-c - 在常量和非常量字符串之间交替时 NSString 的最佳分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17194880/

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