NSString stringWithFormat影响参数

时间:2015-03-29 19:12:21

标签: ios objective-c

我正在经历一些奇怪的行为,我想知道你是否可以向我解释发生了什么。

我有以下代码

@implementation BAClient

NSString* _host = @"localhost:3000";

-(id)init{
    self = [super init];
    if(self){
//where the weird stuff happens
        NSString* str =[NSString stringWithFormat:@"%@/api", _host];
        _connection = [[BAConnectionManager alloc] initWithHost: str];
    }
    return self;
}
@end

在第一行代码运行之后(在注释之后) - _host等于localhost:3000。当下一行代码运行时,它等于localhost:3000 / api。

无论BAConnnectionManager构造函数代码的代码如何 - 这是我不会期望的行为 - 因为我认为stringWithFormat会创建一个新字符串,即使有其他神奇的方式stringWithFormat工作,也没有指向_host的指针被发送给构造函数。

任何方式BAConnectionManager构造函数:

@implementation BAConnectionManager

NSString* _host;

-(id) initWithHost:(NSString*)host{
    self = [super init];
    if(self){
        _host = host;
        _requestSuccessHandlers = [[NSMutableDictionary alloc] init];
        _requestFailureHandlers = [[NSMutableDictionary alloc] init];
    }
    return self;
}
@end

这两个文件位于两个不同的文件上,因此_host存在于两个文件中不应该是一个问题,或者至少它会是一个非常奇怪的行为,因为它们是在两个完全不同的类上定义的。

here is a prove that this is actually happening

我的印象是这里确实存在歧义,但我无法弄明白为什么

1 个答案:

答案 0 :(得分:0)

我已经知道了,因为我是Objective C的新手我愚蠢地认为你创建了私人类成员,只是在@implemintation和@end之间 - 任何修复它的方式:

@implementation BAClient{
    NSString* _host;
}

-(id)init{
    self = [super init];
    if(self){
//where the weird stuff happens
        _host =  = @"localhost:3000";
        NSString* str =[NSString stringWithFormat:@"%@/api", _host];
        _connection = [[BAConnectionManager alloc] initWithHost: str];
    }
    return self;
}
@end

@implementation BAConnectionManager{
     NSString* _host;
}
-(id) initWithHost:(NSString*)host{
    self = [super init];
    if(self){
        _host = host;
        _requestSuccessHandlers = [[NSMutableDictionary alloc] init];
        _requestFailureHandlers = [[NSMutableDictionary alloc] init];
    }
    return self;
}
@end