iPhone: вызывая релиз на объекте: он сразу выходит? - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть корзина в моем приложении.У меня также есть UIBarButton под названием «Пустая корзина».Я реализую функциональность для этой кнопки.Тем не менее, я сталкиваюсь с некоторыми проблемами.Моя корзина является объектом данных Singleton.То, что я хочу сделать, это когда пользователь нажимает «Пустая корзина», все объекты и значения переменных в корзине должны быть освобождены и / или сделаны 0.

У меня есть метод emptyCart, реализованный в моем ViewControllerкоторый в свою очередь называет метод emptyCart объекта CartSingleton.Моя проблема, как показано ниже, вызовы разблокировки для различных объектов не освобождают объекты, потому что, когда я печатаю содержимое корзины после запуска «пустой корзины», я все равно вижу все элементы в корзине.Сообщение о выпуске не вступает в силу сразу?Как я могу мгновенно освободить все объекты в моей Корзине?

Код - «Пустая корзина» в синглтоне:

-(void)emptyCart

{

if (self.selectedLocation != NULL)
   {
    [self.selectedLocation release];
    self.locationSelected = false;
   }

if (self.foodItemsArray != NULL)
   {
    for (int i = 0; i < [self.foodItemsArray count]; i++)
       {
        FoodItem *temp = [self.foodItemsArray objectAtIndex:i];
        if (temp.sidesArray != NULL)
           {
            [temp.sidesArray release];
           }
       }
[self.foodItemsArray release];  
   }

if (self.drinkItemsArray != NULL)
   {
    [self.drinkItemsArray release];
   }

if (self.otherItemsArray != NULL)
   {
    [self.otherItemsArray release];
   }

if (self.customerInfo != NULL)
   {
    [self.customerInfo release];
   }

self.numFoodItems = 0;
//self.totalTaxPercent = 0;
self.foodItemsTotalCost = 0;
self.drinkItemsTotalCost = 0;
self.otherItemTotalCost = 0;
self.totalCostOfAllItems = 0;
self.totalTaxesAmount = 0;
self.totalChargesWithTaxes = 0;
self.gratuity = 0;
self.miscCharges = 0;

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Выпуск релизов сразу - это означает, что он уменьшает количество сохранений, а если количество сохранений равно 0, то объект освобождается.

Ваша проблема в том, что вы держитесь за объекты, а неустановив переменные в ноль после того, как вы закончите с ними.

Я также обеспокоен тем, что вы выпускаете слишком много раз

  1. Массивы освобождают свои элементы при их освобождении
  2. сохраненный @properties освободит объект, для которого они установлены, если вы установите их равными nil - вы должны очистить их следующим образом:

    self.customerInfo = nil;

Итак, берегитесь.Похоже, прямо сейчас вы получаете доступ к освобожденным объектам - которые в конечном итоге рухнут.Чрезмерное освобождение также вызовет проблемы.

Чтобы попытаться выяснить эти проблемы

  1. Используйте Build and Analyze и исправьте ошибки, о которых он сообщает
  2. ВключитеЗомби и узнайте, обращаетесь ли вы к освобожденным объектам

    http://www.loufranco.com/blog/files/debugging-memory-iphone.html

0 голосов
/ 28 апреля 2011

release не делает ничего, кроме как уменьшает количество сохраняемых объектов. Среда выполнения, когда он обнаруживает, что значение retain достигает нуля, вызывает метод dealloc вашего объекта.

Поэтому, если у вас все еще есть объекты, это означает, что другие объекты поместили удержание на объекте (увеличивая его количество сохранений), что означает, что они будут задерживаться.

...