In my previous question, I figured out that all Objective-C objects are declared as pointers. But in C and C++, pointers can be accessed from any function, global or not, and they seem unprotected.
How are they “protected” in Objective-C ?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
ObjC does not police your use of pointers.
There is type checking at compile time, so if you have a pointer to an
NSNumber, and use the variable that holds it to assign to anNSString, the compiler will issue a warning. However, this is easily overridden by casting the pointer, as shown below,In this case, the compiler is told to keep quiet, but accessing
myStringPtras a string would cause ‘undefined results’, hopefully something obvious like a crash, but possibly something more pernicious.Similarly, I could declare,
Then when
notActuallyAStringis accessed at runtime, it is highy likely to cause a bad access exception as the pointer is almost certainly not pointing to anNSString, and quite possibly isn’t a valid memory address at all.This makes C (and its associated languages) powerful for low-level programming (if you actually know the memory mapped address of some hardware register, you can assign them in this way, and access hardware), but brings pretty clear risks.
It gets worse, because you may have a valid pointer at some point in the execution, but the memory that the pointer references is freed off at some later point. Then if you (wrongly) access that pointer, you again may well get an exception as the memory is no longer valid for the purpose the code assumes. Writing (assigning) a via a pointer that pointers somewhere it shouldn’t is a common cause of memory corruption, which can be a devil to diagnose. For this reason, it’s good practice (aka defensive coding) to make sure pointers that you’ve finished with are assigned to nil, so if you reuse those pointers when you shouldn’t, you should get a symptom that is more easy to diagnose than some random memory corruption.
You need a good understanding of pointers to program in objC, and I would recommend reading the timeless classic reference book, ‘The C Programming Language’ by Kernighan & Ritchie which explains the basics of pointers, you can then build your understanding on how pointers and memory allocation is used in ObjC and C++.