2012-02-08 367 views
0

我只是不明白!我有自定義類「Word」,我也生成幾個步驟的Word類對象的NSMutableArray:Objective-c對象的NSMutableArray保留

  1. words = [NSMutableArray array];
  2. for i = 0 to 8
  3. word = alloc + init;
  4. [words addObject:word];
  5. [單詞發佈];

然後我通過話實例另一個類的setter方法:

someInstance.words = words; 

凡的話說就是非原子,保留屬性。我宣佈setWords方法是這樣的:

-(void)setWords:(NSMutableArray *)w { 
    [w retain]; 
    [words release]; 
    words = w; 
} 

當話來的方法爲「W」變量是對象的數組,但是當我保留它,並分配給我的老價值我的話變量變成一個NSMutableArray和指望它等於w.count,但是數組爲0x0。 「=」運算符不會複製數組的項目,我該如何解決它?請幫助,我是一個新手在objective-c。 我instanciate Word只有一種方法,我應該實現無參數初始化方法?

-(id)initWithId:(int)Id Word:(NSString *)Word Card:(int)Card { 
    self.id = Id; 
    self.word = Word; 
    self.card = Card; 
    return self; 
} 

,我生成我的NSMutableArray循環:

Card *card = [[Card alloc] initWithId:[s intForColumn:@"id"] Type:[s intForColumn:@"type"] Used:[s intForColumn:@"used"]]; 
s = [db executeQueryWithFormat:@"SELECT w.id as id, word, card FROM word as w INNER JOIN card as c ON w.card=c.id WHERE c.id=%i ORDER BY w.id, RANDOM()", card.id]; 
while ([s next]) { 
    Word *word = [[Word alloc] initWithId:[s intForColumn:@"id"] Word:[s stringForColumn:@"word"] Card:[s intForColumn:@"card"]]; 
    [card.words addObject:word]; 
    [word release]; 
} 
+0

要了解,你可以看看截圖,我無法將其插入,因爲小有名氣帖子:http://i.stack.imgur.com/UheIk.png – 2012-02-08 21:26:24

+0

向我們展示你的子類的init方法。 – Rog 2012-02-08 21:30:28

+0

另一個想法是在你的setter方法中使用'words = [w mutableCopy]'。 – Rog 2012-02-08 21:34:53

回答

0

有一些問題瓦特/你的代碼。

  • 你需要遵循標準的初始化模式調用super的指定初始值設定項並檢查返回值。

  • 該方法應該被命名爲initWithId:word:card:(即情況錯誤,因此StackOverflow上的愚蠢色彩,甚至)。

  • 如果您的setter/getter只遵循標準模式,則無需實現自定義setter/getter。使用@property和@synthesize。

  • (從您的屏幕截圖)你真的不想直接觸發你的setter的UI更新。總之,無論如何。通常,您希望視圖圖層通過控件觸發模型的更新,一旦模型完全更新,然後讓視圖層知道它應該重新加載。

  • 當你提到你正在實例化一個NSMutableArray實例時,你不會在你的代碼中顯示它。當您添加Word實例時,是否真的設置了card.words

顯示-initWithId:card:type:used :(注意我糾正了大小寫)方法的實現。

I.e.它更好了有類似:

words = [NSMutableArray new]; // Or, if ARC, [NSMutableArray array]; 

OK - 未來...

  • 把一個assert(card.words);while()循環之前...這會如果words ISN炸燬」 t集。

  • 確保該card是非零(沒有理由爲什麼它不應該,但是......當顯而易見的東西看起來正確,你檢查旁邊的真的顯而易見的東西)

關於-reloadData的評論更多的是你想要在首先加載的任何觸發器中加入reloadData。想象一下,在更新整個UI之前,您需要加載幾種不同類型的數據;也許桌面視圖必須重新加載需要更新其他一些東西。通過將reloadData移出設置程序,它(a)使setter變得簡單且不出人意料,同時(b)可以更輕鬆地重構UI層,從而可以同時完成多UI元素更新。

(也 - 請不要把我對嚴厲的編碼風格評論...並不意味着是...有一些細微的,但是普遍的模式,以對象 - 編碼如果你學習和使用它們。 ,它會讓你的生活變得更容易,我們都是新來的Obj-C,只是我們有些人是新手,而其他人甚至還沒有出生。

+0

的陣列 - (ID)initWithId:(INT)I型:(INT)t一起使用:(INT)∪{ self.id = I; self.type =噸; self.used = U; self.words = [NSMutableArray的陣列]; 返回自我; } – 2012-02-08 22:15:05

+0

1.我固定它 2.好的,我的錯誤,糾正 3.但我也想執行[ tableView reloadData]方法 4. tableView是一個UITableView,單詞是我填寫表格單元格的數據s,當我更新數據源時,是不是需要調用reloadData? 5.查看上一頁評論 – 2012-02-08 22:17:20

+0

我做我的工作分配剛剛刪除@synthesize字聲明,並添加的NSMutableArray * words_,但現在我不能讓我的新的數據源tablwview更新,即使[的tableView reloadData]沒有工作=( – 2012-02-08 23:30:51