I have created a Variable called “myDBManager” in my AppDelegate:
@interface myAppDelegate : NSObject <UIApplicationDelegate> {
MyDBManager *myDBManager;
}
@property (nonatomic, retain) MyDBManager *myDBManager;
@end
which I use in most other classes as a global Variable holding all my critical application data. It gets only created once and dies at the end only. So for example to get to the myDBManager in AnyOtherClass
@interface AnyOtherClass : UITableViewController {
MyDBManager *myDBManager;
NSObject *otherVar;
}
@property (nonatomic,retain) MyDBManager *myDBManager;
@property (nonatomic,retain) NSObject *otherVar;
@end
//getting the data from "global" myDBManager and putting it into local var of AnyOtherClass
- (void)viewWillAppear:(BOOL)animated {
//get the myDBManager global Object
MyAppDelegate *mainDelegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];
myDBManager = mainDelegate.myDBManager;
}
- (void)dealloc {
[otherVar release];
//[dancesDBManager release]; DO NOT RELEASE THIS SINCE ITS USED AS A GLOBAL VARIABLE!
[super dealloc];
}
Here is my question: while all other local variables of AnyOtherClass, such as “otherVar” have to be released in the dealloc method of AnyOtherClass (always- is that right?), releasing myDBManager within AnyOtherClass leads to errors in the app.
So I NEVER release the local myDBManager variable in any Class of my app – all other local variables are always released – and it works fine. (Even checking the retainCount).
Am I right, that ALL local variables of classes need to be released in the dealloc of that class, or is it actually OK, not to release these variables at all in cases of using a global variable construct as described? (or any other cases?)
Thanks very much for your help!
In your scenario
myDBManageris not a global or a local variable, it’s an auto-retained property (marked withretain). According to The Objective-C Programming Language: Declared Properties,nonatomic,retainproperties should be explicitly released indealloc. However, if your property is synthesized, you don’t have access to the backing member variable, thus you can’t callreleaseon it; you have to use the property setter to set it tonil, which will sendreleaseto the previous value. Are you by any chance setting themyDBManagerproperty inAnyOtherClassandmyAppDelegatetonil?Update: @Don’s answer is actually correct. You are not invoking the property setter (
self.myDBManager), so the auto-retain does not kick in. I’ll leave my answer so people can learn from my mistake. 🙂