So my question is twofold:
What exactly will entail a performance penalty? (so I know what I should avoid)
How significant is this performance assessment? (so that I can predict in advance which bits of my game should be written in C anyway)
(my base is from apple implementations :)
in most cases, the biggest penalty is that each instance (messaging) method is a dynamic call
the cost of this call / message is about 4x as expensive as a virtual C ++ call.
these calls cannot be optimized (unless someone makes a good JIT / HotSpot implementation), and methods, unlike c or C ++, may not be nested.
but there is more than messaging:
Your objects will be counted according to the schedule. this means: many locks and many individual, small distributions, plus atoms for counting ref.
objc_msgSend and options (meat of the execution of the runtime) can take, for example, 10% of the execution time (extreme cases of the real world).
It can also add to binary size.
Using idiomatic applications pushes it further away from C ++ or c speed in many areas. (for example, consider how numbers are transferred / processed).
how much it costs depends on the size of your methods. a good ood means your methods will usually be short. you will either receive a ton of messages and noticeable weight (if it is high performance), or it will jeopardize your projects.
There are several gotchas, for example, in real-time applications.
int a = myobj-> a;
no diff compared to c
... Exceptions ...
(iirc) Apple's previous exception model was used for expensive customization, now they correspond to C ++ zero-cost exception lines (it is optimized that exceptions will not be regularly thrown and marginal at the input / configuration, but expensive to throw / catch).
If performance is really important, I would avoid it and just go with C ++. It has many features and speed. you will have a little work to do to make some of objc's amenities - most of them are in accessible libraries, not in the language.