【问题标题】:iOS - Alloc objects until didReceiveMemoryWarning is callediOS - 在调用 didReceiveMemoryWarning 之前分配对象
【发布时间】:2013-09-09 12:41:59
【问题描述】:

我需要这样做:分配对象直到调用内存警告,然后释放所有对象。但我有一些问题。我怎样才能做到这一点?我需要代码示例,因为问题在于:代码。我有一个不使用 ARC 的课程。这个类有一个方法,它分配保存到数组中的 N 个对象。我需要在调用 didReceiveMemoryWarning 之前填充内存,因为这是在 iOS 上“释放”RAM 内存的唯一方法。然后,我将全部释放。我认为 App Store 上用于 iPhone 的更干净的内存应用程序使用这个技巧来“释放”内存。 提前致谢

【问题讨论】:

    标签: ios memory memory-management


    【解决方案1】:

    我会编辑/子类化不使用 ARC 的类以使用 ARC,或者向其添加释放 N 个对象的方法。

    【讨论】:

      【解决方案2】:

      您必须填写缺少的详细信息,但这是我以前使用过的。归功于我发现它的人/地方。这将适用于 ARC 和非 ARC 项目。我发现通常在你完全死之前你会收到 2-3 个警告。祝你好运。晚餐长度是每次分配多少块。如果您想要更细粒度的内存控制,请更改大小。

      -(IBAction)startEatingMemory:(id)sender
      {
          if(self.belly == nil){
              self.belly = [NSMutableArray array];
          }
          self.paused = false;
          [self eatMemory];
      } 
      
      - (IBAction)pauseEat:(id)sender {
          self.paused = true;
          [[self class]cancelPreviousPerformRequestsWithTarget:self selector:@selector(eatMemory) object:nil];
      }
      
      - (IBAction)stopEatingMemory:(id)sender {
          [self pauseEat:self];
      
          [self.belly removeAllObjects];
          [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(eatMemory) object:nil];
      
       }
      
      
      -(void)eatMemory
      {
          unsigned long dinnerLength = 1024 * 1024;
          char *dinner = malloc(sizeof(char) * dinnerLength);
          for (int i=0; i < dinnerLength; i++)
          {
              //write to each byte ensure that the memory pages are actually allocated
              dinner[i] = '0';
          }
          NSData *plate = [NSData dataWithBytesNoCopy:dinner length:dinnerLength freeWhenDone:YES];
          [self.belly addObject:plate];
      
      
          [self performSelector:@selector(eatMemory) withObject:nil afterDelay:.1];
      }
      
      
      
      -(void)didReceiveMemoryWarning 
      {
      
          [self pauseEat:self];
          <#Could release all here#>
          [super didReceiveMemoryWarning];
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 2023-03-03
        • 2011-06-24
        • 2011-05-29
        相关资源
        最近更新 更多