代码之家  ›  专栏  ›  技术社区  ›  Julien

目标C——创建字符串数组时应用程序崩溃,我疯了吗?

  •  3
  • Julien  · 技术社区  · 15 年前

    如果我尝试使用这个简单的代码:

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
        // Add the tab bar controller's current view as a subview of the window
        [window addSubview:tabBarController.view];
    
        NSString *stringMer = [NSString stringWithFormat:@"OK COOL"] ;
        NSString *stringMer2 = [NSString stringWithFormat:@"OK COOL"];
    
        NSArray *truc = [NSArray arrayWithObjects:stringMer,stringMer2];
    }
    

    我的应用程序崩溃(“无法读取未知的加载命令0x22”或只是一个常规崩溃)……applicationDidFinishLaunching来自我的fooAppDelegate,我没有更多的代码,这是正常的吗?

    3 回复  |  直到 15 年前
        1
  •  37
  •   Alex Rozanski    15 年前

    传递给 arrayWithObjects: 方法必须是 nil -终止:

    NSArray *truc = [NSArray arrayWithObjects:stringMer,stringMer2, nil];
    
        2
  •  9
  •   NSResponder    15 年前

    不要使用+stringwithformat:除非您实际上有一个需要解析的格式字符串。

        3
  •  2
  •   inked    15 年前

    NSResponder是正确的-不要因为默认为StringWithFormat而变得草率。 Perspex还指出了一个相当明显(但很容易忘记)的错误,即缺少零。

    我会更明确一点-

    (在H)

    NSArray *truc; (assuming it won't be a property)
    

    (m)

    //actually, I'd define, "OK COOL" as a string and init with that, but...
        NSString *stringMer = [[NSString alloc] initWithString:@"OK COOL"] ;
        NSString *stringMer2 = [[NSString alloc] initWithString:@"OK COOL"]; 
    
    
        truc = [[NSArray alloc] initWithObjects:stringMer,stringMer2, nil];
    
    //appease the memory gods
        [stringMer release];
        [stringMer2 release];
    

    (然后,在DealLoc中下降)

    [truc release];
    

    很好的方法是真正熟悉仪器——检查是否有泄漏。