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

标签 cocoa macos

我是 Delphi 程序员,对 Cocoa 非常陌生。 起初我尝试过这个:

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

但是没有成功。然后我尝试在谷歌上搜索但没有成功。 经过大约 30 分钟的实验后,我得到了这个:

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

我的问题是:

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

提前致谢

最佳答案

Do I always need to alloc new NSString to change its value from integer ?

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

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

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

When I uncomment [mystr dealloc], why it won't run ?

永远不要调用dealloc。请改用 release

Cocoa 对象是引用计数的,就像 Delphi 中的 COM 对象一样。与 COM 一样,当您使用完一个对象时,您可以调用release。当对象不再有引用时,它会自动释放。

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

例如:[NSString stringWithFormat:@"%d", 123] 创建一个“自动释放”字符串实例。完成后您不必释放它。对于返回对象的所有方法都是如此,除了 newinit 方法。

Does it cause memory leak to alloc without dealloc ?

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

Where can I find basic tutorial like this on internet ?

参见Practical Memory Management

关于cocoa - 这是向 Cocoa 中的 NSCombobox 添加项目的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973179/

相关文章:

Objective-C:检查 OSX 中的防火墙状态?

objective-c - 如何从另一个类访问 xib 中的 UIPicker?

python - matplotlib savefig 中区分大小写

objective-c - 如何避免不同的类别扩展定义相同的方法

cocoa - 从 Cocoa 中 Applescript 运行的 shell 脚本获取连续输出

macos - 在 Mac 上卸载 vagrant

ruby - 如何在没有sudo的情况下安装ruby gem?

jquery - jQuery keypress、keydown、keyup 黑魔法(在 Mac 上)背后的理论是什么?

macos - "Object controller",实体模式: fetching is slow on Mavericks

macos - Cocoa:在单击和短暂延迟后使 NSTextField 可编辑(如在 Finder 中重命名)