7

Ich möchte wie objektiv C Runtime Griff Argumente wissen, wenn ich ein Ziel C-Methode aufrufen, wieFrage zum Objective C-Aufrufkonvention und Argument übergeben auf ARM

[NSString stringWithFomat:@"%@, %@", @"Hello", @"World"] 

gibt es drei Argumente für dieses Ziel C-Aufruf, wie Funktioniert es im Vergleich zu einem ARM-System? Ich habe Register r0, r1, r2 kennen gelernt, r3 hält die ersten 4 Argumente, wie wäre es mit zusätzlichen Argumenten? Wie bringt es sie auf einen Stapel und knallt sie später auf?

Antwort

18

Für Funktionen, die eine einfache Art zurückgibt:

r0 = self (NSString) 
r1 = _cmd (@selector(stringWithFormat:)) 
r2 = 1st argument (@"%@, %@") 
r3 = 2nd argument (@"Hello") 

dann der Rest auf den Stapel gelegt wird:

[sp,#0] = 3rd argument (@"World") 
[sp,#4] = 4th argument (does not exist in your example) 
... 

Natürlich "Argument" bedeutet hier eine 4-Byte-Objekt. Wenn das Argument> 4 Bytes hat, wird es z.

-[UIView initWithFrame:rect]; 

r0 = self 
r1 = _cmd 
r2 = rect.origin.x 
r3 = rect.origin.y 
[sp,#0] = rect.size.width 
[sp,#4] = rect.size.height 

Der zurückgegebene Wert (bis zu 16 Bytes) werden in r0, r1, r2, r3 platziert werden.


Für Funktionen, die eine Struktur zurückgibt: r0 wird verwendet, um den Zeiger des Rückgabewerts zu speichern.

NSRange retval = [self rangeOfString:string options:options range:range] 

r0 = &retval (of type NSRange*) 
r1 = self 
r2 = _cmd (@selector(rangeOfString:options:range:)) 
r3 = string 
[sp,#0] = options 
[sp,#4] = range.location 
[sp,#8] = range.length 
+0

Dies ist genau das, was ich wissen muss, danke für den Kopf! – overboming

+0

Ausgezeichnete Antwort. –

+0

ähm, mir ist klar, dass das eine blöde Frage ist, aber ... wie kommst du auf die Register? –