ObjC++ is great and it’s possibilities to shoot one’s legs are countless. One of them is returning C++ objects by value from ObjC methods. In case of normal program flow that works just fine. But in case of calling methods of nil objects – they return… just garbage, i.e. the stack memory gets allocated but never touched afterwards. No constructors/destructors are called and you’ll get a C++ object in an undefined state with some garbage inside:
{
auto s = [_foo tellTheTruth]; // _foo != nil: ok, fine
}
This issue might also cause some fun with debugging when C++ lambdas are mixed with ObjC blocks:
void A(std::function<void()> a)
{
if(a) a();
}
void B(void (^a)())
{
if(a) a();
}
int main(int argc, const char * argv[])
{
A( []{} ); // <- ok
A( nullptr ); // <- ok
A( ^{} ); // <- ok
B( ^{} ); // <- ok
B( (void(^)(void)) nil ); // <- ok
A( (void(^)(void)) nil ); // <- crash
return 0;
}
Happy debugging!