菜鸟教程小白 发表于 2022-12-13 16:57:28

ios - 如果我的 iOS 应用程序卡住了整个手机,这是否被视为操作系统本身的错误?


                                            <p><p>我正在开发一个 iOS 应用程序,我在其中使用 AVPlayer 播放不同的 mp4 视频。大多数时候它工作正常。除了有时我的应用程序完全卡住了手机。我无法在发生这种情况的地方捕捉到它,但我认为它通常发生在这条线之后。我通过在打印 <code>[ timeIntervalSince1970]</code> 的位置放置一堆 NSLog 来验证这一点:</p>

<pre><code>mylayer =;
</code></pre>

<p>卡住发生几秒钟(有时更长)。</p>

<p>即使我按下主页按钮或锁定按钮,手机也没有响应。
我最终必须按下锁定按钮大约 6-10 秒,这会硬重启整个手机。</p>

<p>请注意,在此期间 CPU 和内存使用率不会达到峰值。</p>

<p>我知道我的代码可能有问题,但操作系统不应该足够智能,不会让单个应用程序完全卡住整个手机吗?这会被视为操作系统错误吗?如果是这样,我可能会向 Apple 记录 DTS。</p>

<hr/>

<p>****编辑:添加代码****</p>

<p><strong>注意注释“//这是卡住的行”</strong></p>

<pre><code>dispatch_queue_t LOADQUEUE = dispatch_queue_create(&#34;com.yolo.LOADQUEUE&#34;, DISPATCH_QUEUE_CONCURRENT);
      dispatch_async(LOADQUEUE, ^{
            AVURLAsset *avAsset = [ initWithURL:url options:nil];


            NSLog(@&#34;current time 4: %f&#34;,[ timeIntervalSince1970]);
            if ( &amp;&amp; .count&gt;0) {
                NSLog(@&#34;current time 4.5: %f&#34;,[ timeIntervalSince1970]);
                CGSize size = [[ objectAtIndex:0] naturalSize];
                NSLog(@&#34;current time 5: %f&#34;,[ timeIntervalSince1970]);
                CGRect r = self.topHeader.frame;
                r.size.height=((size.height*self.view.frame.size.width)/size.width)+self.topheaderBottomView.frame.size.height+self.topheadertopview.frame.size.height+self.itemTitle.frame.size.height;
                howMuchToScrollToShowCommentButton=r.size.height;

                dispatch_async(dispatch_get_main_queue(), ^{



                  self.topHeader.frame=r;
                  [UIView animateWithDuration:0 animations:^{

                        ;

                  }completion:^(BOOL finished) {

                        NSArray *keys = @[@&#34;playable&#34;];
                        NSLog(@&#34;current time 6: %f&#34;,[ timeIntervalSince1970]);
                        [avAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
                            dispatch_async(dispatch_get_main_queue(), ^{
                              NSLog(@&#34;current time 7: %f&#34;,[ timeIntervalSince1970]);
                              AVPlayerItem *newItem = [ initWithAsset:avAsset];
                              if (!myplayer) {
                                    myplayer = [initWithPlayerItem:newItem];
                              } else {
                                    ;
                              }
                              NSLog(@&#34;current time 7.5: %f&#34;,[ timeIntervalSince1970]);
                              ;
                              ;
                              [ addObserver:self
                                                                         selector:@selector(playerItemDidReachEnd:)
                                                                           name:AVPlayerItemDidPlayToEndTimeNotification
                                                                           object:];
                              myplayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
                              NSLog(@&#34;current time 7.6: %f&#34;,[ timeIntervalSince1970]);
                              mylayer =; // this is the line which freezes
                              NSLog(@&#34;current time 7.7: %f&#34;,[ timeIntervalSince1970]);


                              ;
                              mylayer.videoGravity = AVLayerVideoGravityResize;
                              ;
                              ;
                              NSLog(@&#34;current time 8: %f&#34;,[ timeIntervalSince1970]);
                            });
                        }];


                  }];
                });
            } else {
                NSLog(@&#34;ITEM doesn&#39;t exist&#34;);
            }
      });
</code></pre>

<p><strong>输出:
请注意时间 7.6 和 7.7 之间的 21 秒休息时间:</strong></p>

<pre><code>2016-06-04 01:27:20.853 XYZ current time 7: 1465018040.853897
2016-06-04 01:27:20.875 XYZ current time 7.5: 1465018040.875220
2016-06-04 01:27:20.875 XYZ current time 7.6: 1465018040.875871
2016-06-04 01:27:41.841 XYZ current time 7.7: 1465018061.841419
2016-06-04 01:27:41.841 XYZ current time 8: 1465018061.841863
</code></pre>

<p>编辑 2:</p>

<p>我在 xcode 中暂停了应用程序,并查看了左侧的线程在做什么。截图如下:</p>

<p> <a href="/image/6OWOm.png" rel="noreferrer noopener nofollow"><img src="/image/6OWOm.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这可能是通过 XCode 调试和运行的症状。你是对的,通常你应该总是能够点击主页按钮并退出应用程序。 </p>

<p>编辑您的方案并从调试更改为发布。通过 Xcode 运行一次构建。杀死应用程序,然后从设备的主屏幕启动它而不使用 Xcode。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如果我的 iOS 应用程序卡住了整个手机,这是否被视为操作系统本身的错误?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37626635/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37626635/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如果我的 iOS 应用程序卡住了整个手机,这是否被视为操作系统本身的错误?