2009-12-29 52 views
3

我是Delphi程序員,也是Cocoa的新手。 起初我試過這個:這是在可可中添加項目到NSCombobox的正確方法嗎?

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

但它沒有奏效。然後我試圖在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]; 
    } 
} 

我的問題是:

  1. 這是做了正確的方式?
  2. 我是否總是需要分配新的 NSString將其值從 改爲整數?
  3. 當我取消註釋[mystr dealloc], 爲什麼它不會運行?
  4. 是否會導致內存泄漏,以便在不分配dealloc的情況下分配 ?
  5. 我在哪裏可以找到基本教程,如 這在互聯網上?

在此先感謝

回答

10

難道我總是需要的Alloc新的NSString從整數改變它的價值呢?

通常是的;但是,也有更方便的方法來創建比使用allocinit(見下面的自動釋放池)

您可以通過任何Objective-C的對象類型addItemWithObjectValue:,包括NSStringNSNumber對象的字符串(和許多其他類型的對象) 。這兩個類有許多的方便的類方法,你可以用它來創建新實例,例如:

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

當我取消[myStr中的dealloc],爲什麼它不會跑?

千萬不要致電dealloc。改爲使用release

可可對象是引用計數的,就像Delphi中的COM對象一樣。與COM一樣,當您完成一個對象時,您可以撥打release。當一個對象沒有更多的引用時,它會自動解除分配。

與COM不同,Cocoa有「autorelease pools」,它允許你創建一個新的NSString實例,而不用擔心在其上調用release

例如:[NSString stringWithFormat:@"%d", 123]創建一個「autoreleased」字符串實例。完成後不需要release。所有返回對象的方法都是如此,除了newinit方法。

這是否導致內存泄漏allocallall沒有dealloc?

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

我在哪裏可以在互聯網上找到這樣的基本教程?

Practical Memory Management

1

正確的方法是:

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

可以使用NSNumber代替NSString,取決於上下文這可能是可取的。

您確實需要每次創建一個新對象,因爲addItemWithObjectValue:需要的是對象而不是原始對象。

您可以創建一個新的對象(例如`的NSString),通過兩個方法:

  1. 使用分配/初始化,怎麼樣,你做的最初。這種初始化需要在分配範圍內不再需要時釋放對象,使用release而不是dealloc

  2. 使用stringWithFormat:工廠方法使用自動釋放池「自動」釋放自己。代碼如下所示:

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

    但是,建議不要在循環中使用這樣的構造。

對於內存的問題,檢查出Memory Management Programming Guide for Cocoa

0

根據您發佈的代碼和您所陳述的經驗水平,我建議要通過蘋果的Currency Converter教程,如果你還沒有準備好。這是每個初學者應該閱讀的標準Cocoa教程。包括與IBOutlets交互的基礎知識。

相關問題