菜鸟教程小白 发表于 2022-12-13 05:27:19

ios - 在发布通知并使用 ARC 以单例形式接收通知后,将无法识别的选择器发送到实例


                                            <p><p>很抱歉对我的问题的错误解释。这是我更新的代码和步骤。我也更新了标题。<br/>
<strong>!!!编辑!!!</strong></p>

<p>1) 我正在使用 CoreData 数据库在 ARC 项目中实现搜索。<br/>
2) Search viewController 是从 mainStoryboard 实例化的,如下所示:</p>

<p>搜索 Controller 在 Storyboard中,标识符为“搜索”</p>

<pre><code>SearchTableViewController *searchController = (SearchTableViewController *);
[[ parentViewController] presentViewController:searchController animated:NO completion:nil];
</code></pre>

<p>3) 显示的带有搜索功能的 ViewController 在事件 controllerDidEndSearch 上关闭(例如通过单击 UISearchBar 中的取消按钮)。</p>

<pre><code>-(void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    ;
}
</code></pre>

<p>我的错误仅在我使用搜索打开和关闭 ViewController 时发生。</p>

<p>4) 有一个单例对象正在监听刷新事件。</p>

<p>刷新服务.m </p>

<pre><code>+(RefreshService *)getDefaultRefreshService {
    if (DefaultRefreshService == nil) DefaultRefreshService = [ init];
    return DefaultRefreshService;
}
-(id)init {
    self = ;
    if (self) {
      [ addObserver:self selector:NSSelectorFromString(@&#34;refresh:&#34;) name:@&#34;refresh_event&#34; object:nil];
    }
    return self;
}
</code></pre>

<p>5) 有一个刷新按钮,通过发布通知触发刷新</p>

<pre><code>-(IBAction)refreshAction:(id)sender {
    [ postNotification:];
}
</code></pre>

<p>好案例场景:<br/>
1.启动应用。<br/>
2.点击刷新按钮<br/>
3. 一切正常,refreshService 收到通知并触发刷新方法 - 定义在第 4 点)</p>

<p>以及失败的糟糕用例:<br/>
1.启动应用。<br/>
2.点击搜索按钮-见第2点)<br/>
3.点击取消——见第3点)<br/>
4.点击刷新按钮——见第5点)<br/>
5. 现在它在 refreshService 收到通知之前就失败了,而是我得到了错误:</p>

<pre><code>-: unrecognized selector sent to instance
</code></pre>

<p>或</p>

<pre><code>-: unrecognized selector sent to instance
</code></pre>

<p>或者它在主要功能上失败并显示 SIGABART。 </p>

<p>对我来说,似乎有些东西发布得不好,但我使用的是 ARC,所以我不会手动处理释放对象...</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在尝试了各种选项后,我得出结论,在 NSNotificationCenter 事件上使用单例作为观察者不是线程安全的。在将观察者逻辑从单例移动到普通 Controller 之后,一切正常。我已经尝试了各种单例实现,这些实现应该是 ARC 的线程安全的,但它们都不是作为观察者工作的。 </p>

<p>经过测试的单例实现:</p>

<p>1) 我的单例实现</p>

<pre><code>+(RefreshService *)getDefaultRefreshService {
    if (DefaultRefreshService == nil) DefaultRefreshService = [ init];
    return DefaultRefreshService;
}
</code></pre>

<p>2) 从这里执行 <a href="https://stackoverflow.com/questions/7568935/how-do-i-implement-an-objective-c-singleton-that-is-compatible-with-arc" rel="noreferrer noopener nofollow">How do I implement an Objective-C singleton that is compatible with ARC?</a> </p>

<pre><code>+ (RefreshService *)getDefaultRefreshService
{
    static RefreshService *DefaultRefreshService = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&amp;onceToken, ^{
      DefaultRefreshService = [ init];
    });

    return DefaultRefreshService;
}
</code></pre>

<p>3) 并从这里开始实现:<a href="https://stackoverflow.com/questions/145154/what-should-my-objective-c-singleton-look-like?rq=1" rel="noreferrer noopener nofollow">What should my Objective-C singleton look like?</a> </p>

<pre><code>+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
      initialized = YES;
      DefaultRefreshService = [ init];
    }
}
</code></pre>

<p>对于每三个选项,我都使用了这个 init() 方法:</p>

<pre><code>-(id)init {
    self = ;
    if (self) {
      [ addObserver:self selector:NSSelectorFromString(@&#34;refresh:&#34;) name:@&#34;refresh_event&#34; object:nil];
    }
    return self;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在发布通知并使用 ARC 以单例形式接收通知后,将无法识别的选择器发送到实例,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19860340/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19860340/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在发布通知并使用 ARC 以单例形式接收通知后,将无法识别的选择器发送到实例