I can't seem to find a way to set the static int I have created to assign unique ids to every object I save to persistent memory. The following gives me a 'no setter method 'setIdGen' for assignment to property.
-(void)viewDidLoad
{
PlayerMenuController.idGen = [[NSUserDefaults standardUserDefaults] floatForKey:@"idGen"];
}
As well as the above I've tried creating a static setIdGen method that would return bad access errors, and making NSIntegers with their own set methods. My static NSMutableArray gave the same errors when I tried to assign it using = but worked fine when using setArray.
idGen method:
+ (int) idGen
{
/*static int idGen;
if(!idGen)
{
idGen = 0;
NSLog(@"idGen reset");
}*/
return self.idGen;
}
If you use a static variable and you ever want to subclass this, the static variable will be the same for both parent and child, so any change when addressing the child class, will also change the same 'property' on it's parent. (and vice versa)
The safe way to do it is using objc/runtime.h associated objects
You shouldn't be returning
self.idGen
because anint
is not a property. Your code should work if you do this:Update 2017
Xcode 8 introduced class properties to Objective-C, from the release notes:
This means our sample interface below can become:
However you must still implement the methods yourself, as shown below, as class properties are never synthesised. Note that this also means if you specify property attributes, such as
copy
, that your methods must implement the semantics.Original Answer
It looks like you are trying to implement a class property, but there is not such thing in Objective-C - a property is a pair of instance methods.
However, you can fake it...
While the
@property
declaration is not available to you, if you declare class methods which follow the right naming convention then your compiler may (tested on Xcode 4.6.1, "may" as I cannot offhand point to this being supported, but it's simple to test and will compile time error if not) allow you to use dot notation, i.e. it looks like a class property even if it lacks an@property
.A sample interface:
The implementation:
And test it:
producing:
So we have a "class property" - it looks, walks and quacks like a property ;-)