So, let’s say you have a local variable NSArray *myArray declared in your class header file.
You then write @property (nonatomic, retain) NSArray *myArray also in your header file.
In your .m file, you write @synthesize myArray.
All very standard so far. You now have a variable myArray, which can be accessed through setters and getters synthesized by Apple.
A little bit later, you initialise your variable.
NSArray *anArray = [[NSArray alloc] initWithObjects etc etc...];
self.myArray = anArray;
[anArray release];
So now myArray is pointing to an array in memory, which has a release count of one (if I’m not mistaken).
My question is, why can’t we write
@property (nonatomic, assign) NSArray *myArray;
@synthesize myArray;
..and then by initialisation write
self.myArray = [[NSArray alloc] initWithObjects etc etc...];
This has TOTALLY confused me ever since the first time I saw it. Is there a technical reason for this? Or moral? 😉 Or theoretical?
Any help would be MUCH appreciated…
Cheers
Karl…
You definitely can.
Using “assign” properties instead of “retain” properties is actually a common practice (see some core object header files from Apple for examples). The issue here is your code being aware of this memory relationship (if the property has something in it at any given time).
Some programmers prefer this pattern, in fact. Complete personal control of memory.
I would add, however, that it is a very difficult pattern to protect when there are multiple developers on a project unless they are all the types that like manually managing memory. It’s much easier to leak memory in this pattern from a simple oversight and compilers have a tougher time interrogating such problems.