Переменная Objective C доступна несколькими способами - PullRequest
0 голосов
/ 11 мая 2011

Это мой второй день программирования на ObjectiveC, поэтому я прошу прощения за вопрос noob.

У меня есть ViewController, который выполняет вызов API с использованием async и asihttprequest:

@synthesize loadingStatus;
- (void)loadStatsData
{
    [indicator setHidden:NO];

    loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

    [RESTApiController request:@"/method.json" method:@"GET" options:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObject:@"amount"] forKeys:[NSArray arrayWithObject:@"receiving"] ] parent:self];
}

и получениеэто выглядит так:

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if (receiving == @"amount")
    {
      // do stuff
      [loadingStatus setValue:@"good" forKey:@"amount"];
    }

    if ([loadingStatus valueForKey:@"amount"] == @"good"]) 
      [indicator setHidden:YES];
}

Приложение аварийно завершает работу, когда оно пытается использовать переменную loadingStatus в requestFinished ().Я предполагаю, что переменная каким-то образом распределена, но я не уверен, как к этому подойти.

Два вопроса: 1) Как я могу сохранить состояние loadStatus при вызовах методов, чтобы я мог использовать его так, как я написалкод 2) Есть ли лучший способ достичь моей цели - проверить, завершены ли вызовы API, и скрыть ActivityIndicator?

-M.

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Сделайте так: обратитесь к loadingStatus как self.loadingStatus

self.loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

Таким образом, он проходит через метод доступа и сохраняет его (часть @property в файле .h).

Кроме того, подсказка по программированию: разбивайте строки на более мелкие операторы, чтобы их было легче отлаживать.

2 голосов
/ 11 мая 2011

Вы правы, loadingStatus освобождается. Это потому, что значение автоматически высвобождается.

Если вы измените

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

до

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];
[loadingStatus retain];

или

loadingStatus = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

тогда ваш код будет работать.

Причина этого заключается в том, что объекту, возвращаемому из dictionaryWithObjects: forKeys, был вызван autorelease, поэтому, если вы хотите, чтобы он не был освобожден, вам нужно вызвать retain.

В качестве ссылки , если вы вызываете alloc / init, вы получите объект с счетом сохранения 1. Если вы используете метод, такой как dictionaryWithObjects: forKeys: вы получите объект с счетом хранения 0 . Чтобы решить эту проблему, просто добавьте удержание, и вам будет хорошо.

У Apple есть действительно хорошая документация по управлению памятью. Я рекомендую проверить это, когда у вас есть шанс

Руководство по управлению памятью

Правила управления памятью

Надеюсь, это поможет!

-Скотт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...