2014-09-22 5 views
5

Ich lerne nur Ziel-C und frage mich, warum der folgende Code zu einem Fehler führt?Warum können Objective-C-Objekte in einer Schleife deklariert werden, aber nicht in der Reihenfolge?

In diesem Fall gibt die zweite Zeile einen Fehler, der besagt, dass der Zeiger "p" bereits definiert wurde.

Das macht für mich Sinn; Wenn es jedoch zutrifft, dass ein Zeiger nicht neu definiert werden kann, warum funktioniert dann der folgende Code?

for(int i = 0; i<10; i+=1) { 
    Person *p = [[Person alloc] init]; 
} 

Als ich gebe dieses in XCode gibt keine Fehler, und es kompiliert und läuft gut. In diesem Fall würde ich erwarten, dass die Schleife den Zeiger "p" einfach neu definiert, ähnlich wie sie sequenziell deklariert werden, aber das ist nicht der Fall.

Hat jemand eine Erklärung dafür, warum das so ist?

+4

Heiße Licks .... nicht hilfreich! – Topher

+4

Warum stimmt der down über die Frage ab. Es ist selten, dass ein neuer Benutzer heutzutage eine anständige Frage stellt. Dieses Verhalten sollte belohnt werden. Diese Frage ist klar, es hat relevanten Code. Was möchten Sie sonst noch? – rmaddy

+2

Echo @rmaddy: Fragen, die ein "Neuling" -Unverständnis zeigen, sind keine schlechten Fragen, solange sie klar formuliert sind. Dies ist eine gut geschriebene Frage und zeigt einige Bemühungen, das Problem zu verstehen. – rickster

Antwort

5
Person *p = [[Person alloc] init]; 
Person *p = [[Person alloc] init]; 

Im ersten Fall werden zwei p im gleichen lokalen Bereich, sie sind alle lokalen Variablen, so haben sie die gleiche Priorität. Wir können nicht zwei Variablen mit demselben Namen und derselben Priorität haben.

Person *p = [[Person alloc] init]; 
{ 
    Person *p = [[Person alloc] init]; 
} 

Das wird obiger Fall in Ordnung sein, weil die zweiten p höhere Priorität als die ersten p in ihrem lokalen Bereich hat.

for(int i = 0; i<10; i+=1) { 
    Person *p = [[Person alloc] init]; 
} 

Im zweiten Fall, die ganze p sind in verschiedenen lokalen Bereichen.

+0

Danke für die klare Erklärung. – Topher

+0

FYI - Das zweite Beispiel kann eine Warnung ausgeben, wenn Sie die Warnung "Versteckte lokale Variablen" aktivieren. – rmaddy

+0

@Topher Wenn diese Antwort hilft, akzeptiere sie und stimme ab. – KudoCC

1

Kurz gesagt ist es, weil im Fall der for-Schleife die Variable p lokal für die Schleife selbst ist, so dass am Ende jeder Iteration p und alle anderen Variablen lokal nur auf den Umfang der Schleife freigegeben wird.

+0

Danke! Macht Sinn! – Topher

+1

Es ist kein Problem, dass die Variablen nicht zugewiesen werden. Es ist eine Frage des Umfangs. Es geht nur um den Variablenbereich, nicht um die Objektlebensdauer. – rmaddy

+0

@rmaddy Korrekt, aber ich denke, dass die Lebensdauer des Objekts tangential zum Umfang ist und erwähnenswert war. – Mike

Verwandte Themen