菜鸟教程小白 发表于 2022-12-12 21:38:20

iphone - 应用程序崩溃,内存不足


                                            <p><p>我正在开发一个简单的 iPad 应用程序(iOS 5.1.1 和 Lion 上的 XCode 4.3.3),它可以水平滚动图像。它使用延迟加载,但不幸的是,由于图像大约 3/4 的内存不足,它正在崩溃。我使用 XCode 分析器和 Instruments 来查找和修复任何泄漏,但它仍然崩溃。崩溃日志如下:</p>

<pre><code>Incident Identifier: 91B65E89-4CCE-4CB5-975F-365D23D802E5
CrashReporter Key:   659f640ad55a7dfbaf0305305e0b8f0fb36a6c41
Hardware Model:      iPad1,1
OS Version:          iPhone OS 5.1.1 (9B206)
Kernel Version:      Darwin Kernel Version 11.0.0: Sun Apr8 21:51:26 PDT 2012; root:xnu-1878.11.10~1/RELEASE_ARM_S5L8930X
Date:                2012-06-29 14:51:58 -0700
Time since snapshot: 49 ms

Free pages:      610
Active pages:      0
Inactive pages:    694
Throttled pages:   43266
Purgeable pages:   0
Wired pages:       18518
Largest process:   GBTL

Processes
   Name               UUID                  Count resident pages
      GBTL &lt;d26b776787493174ae14f454a11b746d&gt;   31295 (jettisoned) (active)
debugserver &lt;2408bf4540f63c55b656243d522df7b2&gt;   134
    installd &lt;0f9e14173c503a8089f7f8cd0329a1a0&gt;   403
         atc &lt;1e5f2a595709376b97f7f0fa29368ef1&gt;   605 (jettisoned)
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      96
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      99
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      96
      afcd &lt;c3cc9d594b523fd1902fb69add11c25d&gt;   133
MobileMail &lt;eed7992f4c1d3050a7fb5d04f1534030&gt;    1004 (jettisoned)
      ptpd &lt;62bc5573db7a352ab68409e87dc9abb9&gt;   356 (jettisoned)
mediaserverd &lt;f03b746f09293fd39a6079c135e7ed00&gt;   404 (jettisoned)
      iapd &lt;0a747292a113307abb17216274976be5&gt;   285 (jettisoned)
DTMobileIS &lt;1383b8ed7d373b59a0839e89ab947089&gt;   899
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      99
dataaccessd &lt;473ff40f3bfd3f71b5e3b4335b2011ee&gt;   735 (jettisoned)
springboardservi &lt;b74f5f58317031e9aef7e95744c816ca&gt;   283
syslog_relay &lt;b07876a121a432d39d89daf531e8f2bd&gt;      62
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      98
syslog_relay &lt;b07876a121a432d39d89daf531e8f2bd&gt;      66
notification_pro &lt;373a488638c436b48ef0801b212593c4&gt;      98
filecoordination &lt;0f34c714b10d35318f0d445f1d953386&gt;      98
      geod &lt;976e1080853233b1856b13cbd81fdcc3&gt;   127
absinthed.K48 &lt;04b40efabeac392ba63cba7256b86bb0&gt;      74
   notifyd &lt;f6a9aa19d33c3962aad3a77571017958&gt;   181
aosnotifyd &lt;8cf4ef51f0c635dc920be1d4ad81b322&gt;   369
    BTServer &lt;31e82dfa7ccd364fb8fcc650f6194790&gt;   186
CommCenterClassi &lt;041d4491826e3c6b911943eddf6aaac9&gt;   274
SpringBoard &lt;c74dc89dec1c3392b3f7ac891869644a&gt;    4878 (active)
aggregated &lt;a12fa71e6997362c83e0c23d8b4eb5b7&gt;   356
      apsd &lt;e7a29f2034083510b5439c0fb5de7ef1&gt;   630
   configd &lt;ee72b01d85c33a24b3548fa40fbe519c&gt;   304
fairplayd.K48 &lt;47deae2d0fb23b6594b0128353e8b48d&gt;   115
   fseventsd &lt;914b28fa8f8a362fabcc47294380c81c&gt;   175
   imagent &lt;9c3a4f75d1303349a53fc6555ea25cd7&gt;   361
   locationd &lt;cf31b0cddd2d3791a2bfcd6033c99045&gt;   833
mDNSResponder &lt;86ccd4633a6c3c7caf44f51ce4aca96d&gt;   188
mediaremoted &lt;327f00bfc10b3820b4a74b9666b0c758&gt;   201
   lockdownd &lt;b06de06b9f6939d3afc607b968841ab9&gt;   216
      powerd &lt;133b7397f5603cf8bef209d4172d6c39&gt;   133
   syslogd &lt;7153b590e0353520a19b74a14654eaaa&gt;      97
       wifid &lt;3001cd0a61fe357d95f170247e5458f5&gt;   258
UserEventAgent &lt;dc32e6824fd33bf189b266102751314f&gt;   362
   launchd &lt;5fec01c378a030a8bd23062689abb07f&gt;   123

**End**
</code></pre>

<p>这里是相关代码:</p>

<pre><code>#import &#34;GBTLViewController.h&#34;

@implementation GBTLViewController

@synthesize scrollView;
@synthesize pageControl;
@synthesize pageImages;
@synthesize pageViews;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    ;

    if (!pageControlBeingUsed) {
      // Update the page when more than 50% of the previous/next page is visible
      CGFloat pageWidth = self.scrollView.frame.size.width;
      int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
      self.pageControl.currentPage = page;
    }
}

- (IBAction)changePage {
    // update the scroll view to the appropriate page
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    ;

    pageControlBeingUsed = YES;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    pageControlBeingUsed = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    pageControlBeingUsed = NO;
}

- (void)loadVisiblePages {
    // First, determine which page is currently visible
    CGFloat pageWidth = self.scrollView.frame.size.width;
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth) / (pageWidth * 2.0f));

    // Update the page control
    self.pageControl.currentPage = page;

    // Work out which pages you want to load
    NSInteger firstPage = page - 1;
    NSInteger lastPage = page + 1;

    // Purge anything before the first page
    for (NSInteger i=0; i&lt;firstPage; i++) {
      ;
    }

    // Load pages in our range
    for (NSInteger i=firstPage; i&lt;=lastPage; i++) {
      ;
    }

    // Purge anything after the last page
    for (NSInteger i=lastPage+1; i&lt;self.pageImages.count; i++) {
      ;
    }
}

- (void)loadPage:(NSInteger)page {
    if (page &lt; 0 || page &gt;= self.pageImages.count) {
      // If it&#39;s outside the range of what you have to display, then do nothing
      return;
    }

    UIView *pageView = ;
    if ((NSNull*)pageView == ) {

      CGRect frame = self.scrollView.bounds;
      frame.origin.x = frame.size.width * page;
      frame.origin.y = 0.0f;

      UIImageView *newPageView = [ initWithImage:];
      newPageView.contentMode = UIViewContentModeScaleAspectFit;
      newPageView.frame = frame;
      ;
      ;

      ;
    }
}

- (void)purgePage:(NSInteger)page {
    if (page &lt; 0 || page &gt;= self.pageImages.count) {
      // If it&#39;s outside the range of what you have to display, then do nothing
      return;
    }

    // Remove a page from the scroll view and reset the container array
    UIView *pageView = ;
    if ((NSNull*)pageView != ) {
      ;
      ];
    }
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a   nib.
- (void)viewDidLoad {
    ;

    pageControlBeingUsed = NO;

    scrollView.delegate = self;
    ];
    scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    scrollView.clipsToBounds = NO;
    scrollView.scrollEnabled = YES;
    scrollView.pagingEnabled = NO;

    self.pageImages = [NSArray arrayWithObjects:
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   ,
                   nil];

    NSInteger pageCount = self.pageImages.count;

    self.pageControl.currentPage = 0;
    self.pageControl.numberOfPages = pageCount;

    self.pageViews = [[ init] autorelease];
    for (NSInteger i = 0; i &lt; pageCount; ++i) {
      ];
    }
}

- (void)viewWillAppear:(BOOL)animated {
    ;

    CGSize pagesScrollViewSize = self.scrollView.frame.size;
    self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * self.pageImages.count, pagesScrollViewSize.height);

    ;
}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSInteger pageCount = self.pageImages.count;

    for (NSInteger i=0; i&lt;pageCount; i++) {
    ;
    }

    CGSize pagesScrollViewSize = self.scrollView.frame.size;
    self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * pageCount, pagesScrollViewSize.height);

    ;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn&#39;t have a superview.
    ;

    // Release any cached data, images, etc that aren&#39;t in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.scrollView = nil;
    self.pageControl = nil;
}

- (void)dealloc {
    ;
    ;
    ;
}

@end
</code></pre>

<p>如果有人能弄清楚内存问题发生在哪里以及如何解决,我将不胜感激。谢谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>不知道这些是什么尺寸的图片,但有很多策略可以处理这种情况:</p>

<p>1) 你真的需要将图像加载到 NSArray 中吗?似乎根据您的文件命名方案,您可以构建一些逻辑以根据需要将其从包中拉出,然后在屏幕外立即丢弃。</p>

<p>2) 有时在 @autoreleaseblock 中执行此类操作是有利的。看这里:
<a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html" rel="noreferrer noopener nofollow">https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html</a> </p>

<p>3) 您可能希望查看此示例应用程序缩小大图像以适应较低分辨率的屏幕:
<a href="http://developer.apple.com/library/ios/#samplecode/LargeImageDownsizing/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011173" rel="noreferrer noopener nofollow">http://developer.apple.com/library/ios/#samplecode/LargeImageDownsizing/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011173</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 应用程序崩溃,内存不足,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11269798/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11269798/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 应用程序崩溃,内存不足