Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在常量字符串和非常量字符串之间交替时NSString的最佳分配_Objective C_Cocoa_Memory Management_Nsstring - Fatal编程技术网

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

Objective c 在常量字符串和非常量字符串之间交替时NSString的最佳分配,objective-c,cocoa,memory-management,nsstring,Objective C,Cocoa,Memory Management,Nsstring,我想要一些帮助来更好地理解Cocoa中字符串的记忆特征。 我正在使用的应用程序使用一个视图控制器和n个工具对象。视图控制器在程序生命周期内有效,但工具对象已分配和释放 假设我有一个字符串toolName,并且在我的实现中配置传入的工具对象:如果对象没有工具名称,我想将toolName_uuString设置为@“notset”。如果工具有名称,我想将字符串设置为工具的名称 我想知道将传入值存储到toolName中的正确方法,因为有时这是一个已分配的对象,有时这是一个常量字符串 -(BOOL)set

我想要一些帮助来更好地理解Cocoa中字符串的记忆特征。 我正在使用的应用程序使用一个视图控制器和n个工具对象。视图控制器在程序生命周期内有效,但工具对象已分配和释放

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

我想知道将传入值存储到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,如果您不能使用它(或者您只是想了解内存管理的工作原理),请不要在课堂外发送保留和释放消息。相反,您应该在访问器中执行此操作

因此,您应该创建一个retain或copy属性(通常使用不可变字符串比使用copy更可取,因为它们可能被分配给可变字符串,从而使您使用不可变(因此线程安全)属性的假设无效)

因此,在你的情况下,我建议像这样的二传手:

- (void) setToolName: (NSString*) toolName
{
    if(_toolName== toolName)
        return;
    [_toolName release];
    _toolName= [toolName copy];
}
这样做很好,不必担心setter参数的retain计数是多少。如果它是一个具有未知保留计数的字符串文字,则该对象甚至不会响应发布消息,因此它将在所有程序中保持活动状态(与此不同,它似乎是有效的,因为它避免了在运行时创建对象的开销)。如果复制不可变对象(除非它是缓存的NSNumber或字符串文字),代码只执行简单的赋值,保留计数就会增加


因此,如果您只是遵循“我保留(或复制)我需要使用的东西,我发布我不再需要使用的东西”的规则,那么您做得很好,您不必担心在特定情况下会发生什么,比如字符串文本。

通常,
self->
不用于访问Objective-C中的IVAR。同样,带有返回值的setter也是非常不典型的。您通常希望将setter/getter限制为可以用
@property
表示的内容。但是,如果要使用这样的setter,最好使用
@property(copy)NSString*toolName并让编译器自动合成setter/getter和ivar。是的,这只是为了说明这个概念。