Передача указателя на метод и присвоение ему объекта - PullRequest
1 голос
/ 23 ноября 2011

Рассмотрим этот пример:

NSMutableArray *aArray;
[Util doSomeMagic:aArray];
[aArray count];

- (void)doSomeMagic:(NSMutableArray *)aArray
{
    if(aArray == NULL)
    {
      aArray = [[NSMutableArray alloc] init];
    }
    [aArray addObject:@"magic"];
    [aArray addObject:@"magic2"];
}

Метод doSomeMagic: заполнит массив.Внутри doSomeMagic: я могу правильно определить количество массивов, но вне метода массив остается пустым.Как я могу позволить методу doSomeMagic: изменить содержимое, которое передается?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

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

- (void)doSomeMagic:(NSMutableArray *)array
{
    // for example, let's remove the last element in the array
    [array removeLastObject];
}

Я предполагаю, что ваш doSomeMagic: может выглядеть так (что неработать, потому что он изменяет копию массива для области видимости):

- (void)doSomeMagic:(NSMutableArray *)array
{
    NSMutableArray *newArray = [NSMutableArray arrayWithArray:array];
    // for example, let's remove the last element in the array
    [newArray removeLastObject];
}

РЕДАКТИРОВАТЬ: я вижу, вы добавили свой код doSomeMagic:.Вы должны понимать, передать по ссылке здесь.Поскольку вы вызываете doSomeMagic: с массивом nil (потому что вы объявили aArray, не устанавливая его для указания на что-либо впоследствии), при запуске doSomeMagic: он назначает новый массив для nil, а затем метод возвращается без видимого эффекта.Я предлагаю изменить код, где вы его называете:

NSMutableArray *aArray = [NSMutableArray array];
[Util doSomeMagic:aArray];
[aArray count];

, а ваш метод doSomeMagic::

- (void)doSomeMagic:(NSMutableArray *)aArray
{
    [aArray addObject:@"magic"];
    [aArray addObject:@"magic2"];
}

Имейте в виду, что, поскольку я использую класс arrayв NSMutableArray возвращенный массив будет автоматически освобожден после [aArray count];.Конечный код будет выглядеть так:

NSMutableArray *aArray = [[NSMutableArray array] retain];
[Util doSomeMagic:aArray];
[aArray count];
[aArray release];
0 голосов
/ 23 ноября 2011

Как вы обнаружили, результирующий массив является неизменным. Вам нужно передать его по ссылке

  • (BOOL) TweakMe: (NSMultableArray **) o { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...