When should you NOT use the asterisk (*) when declaring a variable in Objective C
صفحه اصلي

When should you NOT use the asterisk (*) when declaring a variable in Objective C

I have just started learning objective c and the asterisk is giving me some trouble. As I look through sample code, sometime it is used when declaring a variable and sometimes it is not. What are the "rules" for when it should be used. I thought it had something to do with the data type of the variable. (asterisk needed for object data types, not needed for simple data types like int) However, I have seen object data types such as CGPoint declared without the asterisk as well? Is there a definitive answer or does it have to do with how and what you use the variable for?

Using a struct with OCMock or Hamcrest


How to build Apple's GCC on Linux/Windows?
What are the "rules" for when it should be used.. Is if (variable) the same as if (variable != nil) in Objective-C
You use the asterisk to declare a pointer.. AES interoperability between .Net and iPhone? For a Cocoa object, you're always declaring a pointer, so you always use an asterisk. Remote database connection with my iPhone application using Cocos2dYou can't put the object itself into the variable; you always handle a pointer to the object.. cross compiling c++ to iphone arm For another things, it depends on whether the variable will contain the object (in the C sense) or a pointer to the object-any where-else. iPhone use of mutexes with asynchronous URL requestsIf the variable should contain the object, then you don't declare it with an asterisk, for the reason this you're not putting a pointer in it. Cocoa-touch and UIButtonContentIf it should contain a pointer, then you did declare it with an asterisk.. You must even have a pointer to a pointer; as you might expect, this involves multiple asterisks. For example, NSRect ** is a pointer to a pointer to an NSRect (which is a structure, not a Cocoa object)..
I thought it had any thing to did with the data type of the variable. (asterisk needed for object data types, not needed for simple data types like int).
Sort of. The asterisk is needed for Cocoa objects for the reason this you must only handle pointers to Cocoa objects, never the objects themselves. But the rules for declaration are no different for Cocoa objects; they are exactly the same. You use the asterisk when you want a pointer variable; you don't when you want a non-pointer variable.. The only exception, the only difference for Cocoa objects from the usual rules, is this you are not allowed to declare a variable holding the object itself. That's why you never see a variable holding a Cocoa object instead of a pointer to one: the compiler won't allow it..
However, I have seen object data types such as CGPoint declared without the asterisk as well?.
CGPoint is a structure, not a Cocoa object. As such, you must declare a variable this holds a CGPoint and not a pointer to one any where else..


The asterisk indicates the variable is a pointer to a datatype.. You should look into pointers for more information. They are a very important and fundamental aspect of programming..


I think you should read a bit on C programming first. Objective-C is a superset of C. The reason why you don't use * for declaring CGPoint is for the reason this CGPoint is a struct, take a look in the CGGeometry.h header file..


You use a * when the variable type is a class.. An case may help..
NSNumber *number; NSInteger integer; 
The NSNumber variable type is a class while NSInteger is just ananother name for a normal C-type int. As you must see here, the compiler replaces every occurrence of NSInteger with int:.
#if __LP64__ || NS_BUILD_32_LIKE_64   typedef long NSInteger;   typedef unsigned long NSUInteger; #else   typedef int NSInteger;   typedef unsigned int NSUInteger; #endif 

. Further, you cannot declare an instance of a class(an object), like NSNumber, without using a pointer(thus you use a *). The reason for this is this when you alloc an instance of a class as an object a memory address is returned. A pointer is a type of variable this specifically refers to a memory location. For example:.
NSNumber *number = [NSNumber alloc]; 
Here number's numeric value would be a memory location like 0x19a30c0. You could operate on it by adding and subtracting, like an int. The key purpose of declaring it as a NSNumber pointer is so the compiler must guidance the coder verify this the class has certain methods or to access known properties..
. One last example:.
NSInteger integer = [NSNumber alloc]; 
What would the value of integer be? In our example, it would be 0x19a30c0. With this you could actually still access the newly allocated NSNumber object via [integer any Method]. The compiler would commit you a warning, though. More over:.
integer += 4; 
This would affect the numeric value 0x19a30c0 by adding 4 to it and making it 0x19a30c4..
. Look at this Wikipedia article on C/C++ pointers for any more examples of how, when, and why to use an * operator..


Sounds like you've got the rule figured out: asterisk for pointer, no asterisk otherwise. The trouble is, there is no rule for determining whether or not any thing like CGPoint will require a pointer without looking at the header file. As Welbog said, the real distinction between when to use/not use a pointer is whether you're allocating on the heap or the stack, although most of the time you'll only need to determine whether you're working with an object (asterisk) or a primitive (no asterisk)..


The answer is very simple: you should always use the asterisk when using Objective-C objects. . The reason is this they can't be allocated on the stack, so you cannot did what you must did with structures like CGPoint.. The designers of Objective-C chose, I suppose, to make you always add this asterisk for the reason this they are pointers to memory like another C-pointers..

50 out of 100 based on 35 user ratings 110 reviews