菜鸟教程小白 发表于 2022-12-12 09:25:38

ios - iOS静态库中的单例


                                            <p><p>我有一个包含 Singleton 类(FMDB SQLite 数据访问)的静态库,现在我从我的主应用程序打开连接并做一些事情......这有效,之后我的库中的一个方法想要调用我的单例的方法,我得到的错误是 </p>

<pre><code>-: message sent to deallocated instance 0xa443960
</code></pre>

<p>这难道不是我想要达到的目标吗?</p>

<p>这是我单例的短版</p>

<pre><code>    static MySingleton* _sharedMySingleton = nil;

    FMDatabase *database;

   #ifndef __clang_analyzer__
    +(MySingleton*)sharedMySingleton
   {
    @synchronized()
    {
      if (!_sharedMySingleton)
            [ init];

      return _sharedMySingleton;
    }
      }
      #endif

    +(id)alloc
   {
    @synchronized()
    {
      NSAssert(_sharedMySingleton == nil, @&#34;Attempted to allocate a second instance of a singleton.&#34;);
      _sharedMySingleton = ;
      return _sharedMySingleton;
    }
   }

   -(Resource *)getResourceForName:(NSString *)name
    {   
    NSString *select = @&#34;SELECT Data, MimeType FROM File WHERE FileName = ? LIMIT 1&#34;;

    NSArray *arguments = ];

    FMResultSet *s = ;

    if (s == NULL)
    {
      FuncFileLog(@&#34;getResourceForName file cant be loaded: %@&#34;, );
      return nil;
    }
    NSData *data = nil;
    NSString *mimeType;

    while ()
    {
      data = ];
      mimeType = ;
    }

    Resource *resource = [[ initWithData:data mimeType:mimeType] autorelease];

    return resource;
    }

    -(BOOL)openDatabase
    {
    database = ];
    return ;
    }

   -(void)closeDatabase
   {
      ;
       ;
   }

    -(void)dealloc
    {
    if (database != NULL)
    {
      ;
    }
    ;
    ;
    }

    @end
</code></pre>

<p>编辑:</p>

<p>我发现 FMDatabase 中的 dealloc 在我的应用程序启动返回后被调用,但不知道为什么。</p>

<p>EDIT2:</p>

<p>目前我认为一个问题是这一行</p>

<p>database = ];
这里我要保留对象。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您实际上并没有分配单例实例:</p>

<pre><code>if (!_sharedMySingleton)
    [ init];
</code></pre>

<p>应该是:</p>

<pre><code>if (!_sharedMySingleton)
   _sharedMySingleton = [ init];
</code></pre>

<p>并转储覆盖的 <code>alloc</code> 方法。</p>

<p>另外,<code>database</code> 应该是类中的实例变量,而不是全局范围。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - iOS静态库中的单例,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/15226269/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/15226269/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - iOS静态库中的单例