Permalänk
Medlem

* i objective-C

Jag håller på att försöka lära mig objective-C, men det är en sak jag inte riktigt får grepp om...

Jag har fårstått att om man skriver:

NSString *name;

så är det en pekare till NSString-objektet... Helt okej...

Men varför skriver man stjärnan innanför parantesen när man tex skriver:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Varför inte skriva:

- (UITableViewCell)*tableView...

!?

Visa signatur
Permalänk
Medlem

Första raden skulle lika gärna kunna skrivas:

NSString* name;

Då kanske det blir mer logiskt.

I det sista exemplet castar du själva innehållet i pointern, medans du i andra exemplet castar du pointern i sig till en speciell typ av pointer.

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
Medlem
Skrivet av Nioreh83:

Första raden skulle lika gärna kunna skrivas:

NSString* name;

Då kanske det blir mer logiskt.

I det sista exemplet castar du själva innehållet i pointern, medans du i andra exemplet castar du pointern i sig till en speciell typ av pointer.

Okej... Tror jag fattar...
(UITableViewCell)*tableView skulle vara en pekare till tableView,
men när man skriver (UITableViewCell*)tableView så är tableView en pekare till UITableViewCell... Låter väl logiskt tror jag.

Visa signatur
Permalänk
Medlem
Skrivet av ketels:

Okej... Tror jag fattar...
(UITableViewCell)*tableView skulle vara en pekare till tableView,
men när man skriver (UITableViewCell*)tableView så är tableView en pekare till UITableViewCell... Låter väl logiskt tror jag.

Nej. Pekaren är alltid associerad med typen, inte variabeln (och därför ser det mer logiskt ut att skriva asterisken brevid typnamnet istället för variabelnamnet). Det du gör när du skriver (UITableViewCell*)tableView är att casta tableView till en "pekare till UITableViewCell", vilket är logiskt och tillåtet. Skriver du å andra sidan (UITableViewCell)*tableView så derefererar du pekaren tableView, och försöker sedan casta objektet till ett annat objekt. Det är inte tillåtet, IIRC, och det är inte det du vill göra (eftersom du då inte längre har en pekare, och om du försöker tilldela uttrycket till en variabel så kommer du kopiera objektet).