2011-07-19 42 views
3

我最近開始使用iOS編程(與來自iTunes U的Stanford CS193P講座)。我被困在家庭作業中,那個可怕的計算器目前對我來說有點太難了,所以我開始編寫一些非常簡單的應用程序來習慣Objective-C中的語法和數據結構。初學者iOS應用程序的改進

我寫了一個小應用程序,它有兩個按鈕。一個'初始化'一個數組,並填充兩個UILabels與a)第一個對象(objectAtIndex:0)和b)count。然後我有一個按鈕,它允許我循環訪問數組..當我單擊時顯示下一個對象,當然,當我到達數組的末尾時,將返回到第一個對象。

這很簡單。我知道。但是,唉,我沒有像斯坦福大學的學生那樣得到任何反饋,看書也沒有讓我感覺好。所以我想問一些反饋和可能的代碼改進,最佳實踐等等。

我用一種方法創建了一個模型,它創建了一個項目列表。然後我發送retain給它,因爲沒有它我得到了EXC_BAD_ACCESS問題;所以在這裏我的第一個問題:這是好嗎? :)起初我並不認爲我必須保留它,但當我確實保留它時,我仍然不完全明白它爲什麼起作用。或者以某種方式返回並將其「捕獲」到控制器中會更好?我真的不確定這裏'好'的方式。

-(void)populateItemsList 
{ 
    itemsList = [NSArray arrayWithObjects:@"Test", @"Test2", @"test3", nil]; 
    [itemsList retain]; 
} 

開,在我的控制器接下來的一段代碼:

我懶洋洋地在這裏實例化了我的模型,因爲我學會了如何從斯坦福大學計算機分配做到這一點。我想這樣做可以嗎?我明白這樣,模型的內存直到實際需要時纔會使用?

- (DisplayerModel *)model 
{ 
    if(!displayerModel) 
    { 
     displayerModel = [[DisplayerModel alloc] init]; 
    } 

    return displayerModel; 
} 

我然後必須「創造」陣列和填充我出口(2個UILabels,如前所述)的方法。

- (IBAction)createArray:(UIButton *)sender 
{ 
    [[self model] populateItemsList]; 
    arrayCount = [[[self model] itemsList] count]; 
    stepper = 0; 
    NSString *firstObject = [[[self model] itemsList] objectAtIndex:stepper]; 
    countDisplay.text = [NSString stringWithFormat:@"%d", arrayCount]; 
    display.text = [NSString stringWithFormat:@"%@", firstObject]; 
} 

我老實說不知道這段代碼。它可能只是我,因爲我不太習慣在Objective-C中編寫代碼;我可以在這裏改進嗎?我特別關心整個stepper的想法。我正在尋找像currentIndex或類似的東西,但我似乎無法在文檔中找到它..這就是爲什麼我創建了步進變量來跟蹤我在數組中的位置。

然後終於,這讓我循環的方法:

- (IBAction)showNextValue:(UIButton *)sender 
{ 
    if (stepper == arrayCount - 1) { 
     stepper = 0; 
    } 
    else { 
     stepper ++;  
    } 
    display.text = [NSString stringWithFormat:@"%@", [[[self model] itemsList] objectAtIndex:stepper]]; 
} 

我不會把我的deallocviewDidUnload覆蓋這裏是因爲好..我測試了泄漏這個應用程序,它似乎並不泄漏任何內存。還有其他方法來測試這個嗎?構建和分析也不會報告任何問題。是否還有其他缺陷需要注意?

感謝任何願意查看我的代碼並向我提供一些建議等的人仍在學習!

回答

3

按照慣例,在開始時使用類名的類方法返回一個自動釋放對象。而alloc/initnew會返回一個具有單個保留計數的對象。

因此:

foo = [[NSArray array] retain]; 
foo = [[NSArray alloc] init]; 
foo = [NSArray new]; 

都是等效的,並用1


懶惰創建所需對象中的保留計數創建一個對象(一個空數組)通常是一種好的做法。在各種情況下發布這些東西也很好,viewDidUnload和內存警告是兩個常見的地方。如果你這樣做,你可能想以某種方式保存狀態 - 通常是NSUserDefaults


步進變量是非常好的。如果您願意,可以將其封裝在您的模型中。但在控制器中也是可以接受的位置。

+0

所以如果我理解正確的話,我用'[array]'完成的方式,對象是自動釋放的,因爲我一開始並沒有保留它?我懂了;現在有道理:) – cabaret

1

看起來不錯。 NSArray沒有任何東西像currentIndex。一個數組只包含元素。相同的數組可以被許多對象引用。如果兩個對象xy使用數組a,a分別不能跟蹤用戶xycurrentIndex。這是xy擁有自己的stepper的責任,就像你一樣。