关于此警告的另一个呼声。

首先,我在其他地方查看了所有关于这里的所有问题,但似乎没有一个适合我的情况。它与“警报”框和退出作为第一响应者无关,也与显示视图之前不执行任何动画无关。实例化基于UIView的自定义键盘时发生我的问题。

其次,我相信我可以随意使警告出现/消失。我只是对为什么感到很困惑,所以我更多的是寻求解释而不是解决方案。

这里要发布的代码太多,所以我只概述发生的事情:


  ViewController“ Calc”在VC的loadView方法中实例化一个基于UIView的自定义“ DataView”,然后将其添加为VC的子视图。
  
  “ DataView”在DataView的init方法中实例化基于UITextField的自定义“ TextFieldKPD”
  
  “ TextField”在TextField的init方法中实例化基于UIUI的自定义“ KeyPad”,并将该KeyPad分配给TextField的inputView。
  
  “ KeyPad”创建13个UIButtonTypeCustom类型的UIButton,读入并为每个按钮分配“已按下”和“未按下”图像,以及为按钮设置操作。然后,将每个按钮添加为自身的子视图。 (通过控制在KeyPad的UIView生命周期中何时发生这种构造,这是我如何影响wait_fences警告的方法:请参阅下文。)


“ Calc” ViewController是最初显示给用户的那个。我已经跟踪了calc的viewDidLayoutSubViews方法结束之后和调用其viewDidAppear方法之前发生的wait_fences警告。请注意,显示Calc时,键盘不可见。

我似乎可以通过更改键盘的构造方式来控制wait_fences警告的动作:


如果将UIButton实例化并作为子视图添加到KeyPad的init方法中,那么我将一次又一次收到警告。
相反,如果实例化按钮并将其添加到KeyPad的layoutSubViews方法中,则不会出现警告。 (但是,直到我点击TextField为止,KeyPad才有效地构建起来-仍然,也没有wait_fences警告)


Calc的loadView中没有动画或任何内容。它是实例化的,并一直向下分配。

那么对此版本的wait_fences有何评论?

1月30日编辑1,现在更加困惑!

今天早上我很无聊,所以我决定使用我的代码,看看是否可以更好地隔离警告的产生。我将其范围缩小到以下完全无用的代码,现在可以使用它们触发警告:

-(void)loadImages
{
    UIImage* image;

    for(int i=0; i<16; i++) {
        image = [UIImage imageNamed:@"StupidFileNameThatDoesNotExist"];
    }
}


如果我在[self loadImages]的init方法中执行KeyPad,则会出现警告。但是此代码不执行任何操作,因为该文件不存在。我认为,如果循环计数器足够小,则警告确实会消失,但是我没有限定下限。

如果我将图像的实际加载替换为

[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]

并且仍然在KeyPad初始化期间调用该方法,那么我似乎没有收到警告。这两种加载图像的方式之间明显的区别是imageNamed在内部缓存图像。

因此,我倾向于George的回答,即这是Apple内部的问题。

编辑2月2日,它是警告吉姆,但并非我们所知

所以我说服自己,很明显是导致UIImage类缓存的原因。怎么办呢?好吧,当然写我自己的图像缓存!

因此,我开始插手,删除试图加载无效图像的代码,然后直接生成所需的文件名,并将其传递给高速缓存控制器。因此,为了验证一切是否开始在一起,我在缓存控制器内为每次尝试缓存图像生成了NSLog消息-仅此而已-仅记录文件名。

猜猜是什么-我又收到了愚蠢的警告。根本不做任何实际工作。

我只能得出结论,当我将额外的代码塞入KeyPad的init方法时,会触发某种内部iOS竞争条件。而且我无能为力。我所能做的就是希望这个警告是良性的。

编辑3,《哈姆雷特行动1》场景4:丹麦某处腐烂

保持与Edit 2中相同的代码,我注释掉了NSLog语句。警告消失了。我放回去,并出现警告。

所以我的代码是:

-(void)loadImages
{
    // Iterate over button definitions and cache the required images
    for(int i=0; i<numKeys; i++) {

        if (![imageCache imageExistsForTag:keyTags[i]]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_NP.png",keyNames[i]] forTag:keyTags[i]];
        }

        if (![imageCache imageExistsForTag:keyTags[i]+pressedOffset]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_P.png",keyNames[i]] forTag:keyTags[i]+pressedOffset];
        }

    }

}


和:

-(void)addImageFile:(NSString*)imageFile forTag:(int)tag
{
    NSLog(@"Adding tag:%d for file %@", tag, imageFile);
}


使用该NSLog语句控制警告的出现。

编辑4,2月2日-欢迎来到厄运神庙

怀着Allen的评论,我将键盘重建为XIB并加载了它,而不是手动尝试构建视图。当然,这并不能解决任何问题。我曾希望,笔尖加载不会发生在导致问题的原因之外。

我的直觉是我在Calc的loadView和一些内部iOS活动中遇到了竞争问题。如果我在loadView内做太多工作,那么我会越线并触发wait_fences警告。而且键盘是一种症状,而不是根本原因。 IE可能是任何活动,只是键盘工作是警告开始出现之前我要做的最后一件事。我只是希望我真的知道我实际上正在越过而不是在黑暗中绊倒的限制是什么。

最佳答案

我之前几次遇到过这个问题,并试图找到解决方案。我得到的最接近的信息是,根据苹果工程师的说法,这是内部引起的问题,第三方开发人员不必担心。据我所知,它不应该导致您的应用程序崩溃或引起任何问题,除了调试器中确实令人讨厌的错误,这似乎使所有开发人员都发疯了!

抱歉,我帮不上什么忙。

关于iphone - wait_fences:无法收到回复:10004003(再次),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8994998/

10-12 01:52