这是在Cocoa中向NSCombobox添加项目的正确方法吗?

Irw*_*wan 3 macos cocoa

我是Delphi程序员,也是Cocoa的新手.起初我试过这个:

-(void)awakeFromNib
{
    int i;
    NSString *mystr;
    for (i=1;i<=24;i++)
    {
      [comboHour addItemWithObjectValue:i];
    }
}
Run Code Online (Sandbox Code Playgroud)

但它没有用.然后我试着在Google上搜索但没有运气.经过大约30分钟的试验,我来了:

-(void)awakeFromNib
{
    int i;
    NSString *mystr;
    for (i=1;i<=24;i++)
    {
        mystr = [[NSString alloc]initWithFormat:@"%d",i];
        [comboHour addItemWithObjectValue:mystr];
        //[mystr dealloc];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这是正确的方法吗?
  2. 我是否总是需要分配新的NSString来从整数中更改其值?
  3. 当我取消注释[mystr dealloc]时,为什么它不会运行?
  4. 没有dealloc会导致内存泄漏吗?
  5. 我在哪里可以在互联网上找到这样的基础教程?

提前致谢

Dar*_*ren 11

我是否总是需要分配新的NSString来从整数中更改其值?

一般是的; 但是,有更方便的方法来创建字符串(以及许多其他类型的对象)而不是使用allocinit(请参阅下面的自动释放池)

您可以将任何Objective-C对象类型传递给addItemWithObjectValue:包括对象NSStringNSNumber对象.这两个类都有许多方便的类方法可用于创建新实例,例如:

for (int i = 0; i < 24; ++i)
{
    [comboHour addItemWithObjectValue:[NSNumber numberWithInt:i]];
}
Run Code Online (Sandbox Code Playgroud)

当我取消注释[mystr dealloc]时,为什么它不会运行?

从不打电话dealloc.请release改用.

Cocoa对象是引用计数的,就像Delphi中的COM对象一样.和COM一样,release当你完成一个对象时就会调用.当一个对象没有更多引用时,它会自动释放.

与COM不同,Cocoa具有"自动释放池",例如,它允许您创建一个新的NSString实例,而不必担心调用release它.

例如:[NSString stringWithFormat:@"%d", 123]创建一个"自动释放"的字符串实例.完成后你不需要release它.这是返回一个对象的,除了所有的方法真newinit方法.

没有dealloc会导致内存泄漏吗?

是的,除非您使用垃圾收集.

我在哪里可以在互联网上找到这样的基础教程?

请参阅实用内存管理