2011-05-05 27 views
1

所以我有這塊代碼它將玩家添加到我的ViewController playerList中的NSMutableArray。出於某種原因,我無法將所有玩家名打印到日誌中。難道我做錯了什麼?我不斷收到一個錯誤,說成員Refrence struc objc_object是一個指針。任何人都可以看到我做錯了什麼?數組,屬性和NSLog的問題

p1,p2,p3,p4都是隻有玩家名字的NSString對象。

addPlayer方法創建一個名爲playerName的屬性的新玩家對象。

- (IBAction)addPlayerButton:(id)sender { 
    [self.playerList addObject:[self addPlayer:p1]]; 
    [self.playerList addObject:[self addPlayer:p2]]; 
    [self.playerList addObject:[self addPlayer:p3]]; 
    [self.playerList addObject:[self addPlayer:p4]]; 
    for (id element in playerList) { 
     NSLog(element.playerName); 
    } 
} 

回答

4
for (id element in playerList) { 
    NSLog(element.playerName); 
} 

編譯器警告/錯誤是因爲elementid類型的,你不能使用帶有id類型的對象引用(創建該功能時的特定設計選項,btw)的點語法。

固定碼:固定

for (Player *element in playerList) { 
    NSLog(@"%@", element.playerName); 
} 

兩個(無關)問題:

  1. 明確鍵入element是到您的播放器類的引用(假定我的名字)。這將允許點語法工作。

  2. 使用格式字符串與NSLog。例如,如果玩家的名字包含格式序列 - 例如%@ - 那麼NSLog()會嘗試將下一個(不存在的)參數擴展爲NSLog,並且您的應用會崩潰或打印垃圾(例如,如果玩家的名字是「Bob%f%f%f」)。


does not看起來像他們所得到 添加到陣列中適當

確保分配數組並將其分配給地方playerList:

self.playerList = [NSMutableArray array]; 
+0

你是對的,數組是空的,我把它作爲我的視圖控制器的屬性,那好吧? – Weston 2011-05-05 15:23:52

0

使用這個代替:

NSLog(@"%@", element.playerName); 

的NSLog是有點像printf()和朋友,但不完全是。您必須提供第一個參數,該參數是具有您要使用的格式的字符串文字,後面跟隨格式中表示的所有變量。在Objective-C中,特殊格式%@的意思是「使用obeject的description方法來填充一個值(如果有的話)」。有時候你會得到一個類似於調試器的輸出,用於沒有該方法的對象,例如或者一些這樣的,當然這不是太有用。

在你的情況,假設playerName是一個NSString,如果你在NSLog的第一個參數中使用格式%@,你會看到它的名字輸出。

編輯:

您應該能夠使用for聲明是這樣的:

for(Player *p in playerList) { 
    NSLog(@"%@", p.playerName); 
} 

僅僅因爲你使用addObject:添加的對象,並不意味着你必須放棄使用對象'當你從數組中查看它們時鍵入。

事實上,如果在playerList的對象僅僅NSString s,則你的循環可以簡單地

for(NSString *name in playerList) { 
    NSLog(@"%@", name); 
} 
+0

我儘管如此,但它仍然在做同樣的事情,它希望我能夠取代它。用 - > – Weston 2011-05-05 15:14:17

+0

向下投票?真?我認爲問題的實質在於OP沒有完全理解這裏關於對象的一些基本知識並且使用它們。我認爲我的答案提供了相當多的細節和清晰度,最終是一個簡單的問題。隨你。 – 2011-05-05 15:17:29

+0

我沒有downvote。好的,所以這實際上停止了錯誤,但現在它不打印。如果我在我的initalizer中放置一個NSLog,我發現這些對象正在被創建,但它看起來並不像它們被正確添加到數組中。 – Weston 2011-05-05 15:18:35