【问题标题】:Objective-c static instanceObjective-c 静态实例
【发布时间】:2010-10-31 23:57:10
【问题描述】:

我想创建基于数据库的模型,所以我想使用我自己的 DatabaseModel 类来管理数据库连接,并且每个使用数据库的类都派生自它(它将是模型和表之间的映射) .我正在使用 sqlite API。

由于我只需要一个数据库连接实例,我创建了一个静态变量来存储连接实例

数据库模型.h --------------- @interface 数据库模型:NSObject { } // 连接实例 静态 FMDatabase *数据库; +(BOOL) 打开; +(无效)关闭; +(id)获取数据库; @结尾 数据库模型.m --------------- // 有必要吗? 静态 FMDatabase *database = nil; @implementation 数据库模型 +(BOOL) 打开 { // 建立连接(涂鸦代码) 数据库 = [DBAPI 打开]; } +(无效)关闭 { // ... } +(id)获取数据库 { // 抛出 bad_memory_access [数据库保留]; 返回数据库; } @结尾 我的类.h --------- @interface MyClass : 数据库模型 { } -(无效)foobar; @结尾 我的班级.m --------- @implementation MyClass -(无效)foobar { // 这个赋值不起作用 数据库 = [数据库模型 getDatabase]; } @结尾

在这种情况下 [database retain] 会引发 bad_access 异常。我不太明白,当数据库是静态变量时,为什么会收到此消息...

【问题讨论】:

    标签: objective-c static


    【解决方案1】:
    1. 您似乎没有创建 任何地方的对象。你需要分配 并在你可以之前初始化对象 使用它。
    2. 您不应该在每次有人调用 +getDatabase 时都保留静态对象。这将导致对象被过度保留,实际上没有任何理由,一旦你分配并初始化它,静态变量将拥有它,你不再需要保留。

    Cocoa 有一个设计模式调用Singleton,在这里可以很好地工作。您创建一个类的单个实例,然后拥有一个返回该实例的方法(通常类似于 +sharedClassName)。

    如需更多阅读内容,可在 CocoaDev 获得一些关于 singleton design pattern 的好信息,而 Cocoa with Love 在 Singletons, AppDelegates and top-level data 上有一篇好文章。

    【讨论】:

    • 1.在 open 方法中,它是由 API 分配的,我不想使用单例,因为它不是典型的单例。会有更多的派生类,我只想在所有类中使用相同的数据库连接。 (线程安全是我的问题..)所以我在应用程序开始时打开连接,并在程序终止时关闭。感谢您的链接...
    【解决方案2】:

    在您的 +open 方法中,您有:

    database = [DBAPI open];
    

    如果 DBAPI 遵循标准 Cocoa 内存规则,则不会保留返回的实例(通常是自动释放的)。因此,当您在+getDatabase 中访问它时,该实例可能已经被释放了。

    简单的解决方法是保留实例:

    database = [[DBAPI open] retain];
    

    更好的方法是采用其他人提到的单例模式。

    【讨论】:

      【解决方案3】:

      这个错误实际上是说数据库变量仍然为空。我没有看到数据库变量或分配的任何初始化调用。 我错过了什么吗?

      【讨论】:

        【解决方案4】:

        对不起各位!

        这是我的错。在 Open() 函数中,API 要求一个 (NSString*) sqlite 路径。我忘了保留那个变量。 (我有时在 Objective-C 内存管理方面遇到问题,抱歉)

        现在我在基类上创建没有 static 关键字的变量,并使用 extern 关键字到达子类,它是否有效。

        使用 static 关键字,它在派生类中是不可见的...

        【讨论】:

        • 静态变量仅在声明它的文件中可用。您的子类必须调用 +getDatabase 方法来获取对它的引用。
        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        相关资源
        最近更新 更多