代码之家  ›  专栏  ›  技术社区  ›  user387184

使用AppDelegate的变量作为全局变量-关于释放/保留的问题

  •  3
  • user387184  · 技术社区  · 16 年前

    我在AppDelegate中创建了一个名为“myDBManager”的变量:

    @interface myAppDelegate : NSObject <UIApplicationDelegate> {
       MyDBManager *myDBManager;
    }
    @property (nonatomic, retain)  MyDBManager *myDBManager;
    
    @end
    

    在大多数其他类中,我使用它作为一个全局变量来保存所有关键的应用程序数据。它只被创建一次,只在最后死去。例如,在任何其他类中访问myDBManager

    @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];
            }
    

    这里是我的问题:虽然任何其他类的所有其他局部变量,例如“otherVar”必须在任何其他类的dealloc方法中释放(总是-是这样吗?),但是在任何其他类中释放myDBManager会导致应用程序中的错误。

    我说得对吗,类的所有局部变量都需要在该类的dealloc中释放,或者在使用所描述的全局变量构造的情况下根本不释放这些变量,这实际上是可以的吗(或者其他情况?)

    2 回复  |  直到 16 年前
        1
  •  2
  •   Franci Penov    16 年前

    在你的场景中 myDBManager retain ). 根据 The Objective-C Programming Language: Declared Properties , nonatomic,retain 属性应在中显式释放 dealloc . 但是,如果您的属性是合成的,您就没有访问backing member变量的权限,因此您不能调用 release 在它上面;必须使用属性设置器将其设置为 nil ,将发送 释放 我的经理 中的属性 AnyOtherClass myAppDelegate ?

    更新 :@唐的回答其实是正确的。您没有调用属性设置程序( self.myDBManager ),因此自动保留不会启动。我会留下我的答案,这样人们就可以从我的错误中吸取教训

        2
  •  2
  •   Don    16 年前

    当您在其他类中引用它时,您没有保留它,因此此时发布它不是您的。您直接设置ivar,因此属性上的保留不起作用。如果你打电话来

    self.myDBManager = mainDelegate.myDBManager;
    

    您将保留它,并且在解除类的锁定时必须释放它。

    但是,如果它是一个全局变量,为什么不在其他类中使用它呢?为什么不打电话 mainDelegate.myDBManager 你什么时候需要数据库管理员?