Указатель не обновляется при переходе в метод? - PullRequest
0 голосов
/ 26 января 2012

Указатель, передаваемый в метод menuItem, назначается, а для «Указателя внутри» регистрируется значение. Но для «Указателя снаружи» значение «ноль» ... почему? Я передал указатель, и он должен был быть изменен в методе?

В заголовочном файле:

UIButton *bMenu_time;
UILabel *lMenu_time;

Реализация:

- (void) menuItem: (UIView*)vMenu  menuButton:(UIButton*)bMenu menuLabel: (UILabel*)lMenu  menuPosX: (double)posX   menuLenX: (double)lenX  menuTagNum: (int)tagNum menuText: (NSString*)txtMenu{

    bMenu = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [bMenu setFrame:CGRectMake(posX,0,lenX,25)];
    [bMenu setTag: tagNum];
    [bMenu addTarget:pSelf action:@selector(NewNumber:) forControlEvents:UIControlEventTouchUpInside];
    [vMenu addSubview:bMenu];


    lMenu = [[UILabel alloc] initWithFrame:CGRectMake(posX,0,lenX,25)];
    [lMenu setBackgroundColor:[UIColor lightGrayColor]];
    [lMenu setText:[NSString stringWithFormat:  txtMenu]];
    [lMenu setFont:[UIFont systemFontOfSize:14 ]];
    [lMenu setTextAlignment:UITextAlignmentCenter];
    [vMenu addSubview: lMenu];

    NSLog(@"\nPointer Inside: %@\n", lMenu); // <--------- INSIDE WORKS
}



- (void) menuBuild{     
    pSelf = self;
    theString = @"";


    vMenu = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,25)];
    [pSelf.view addSubview:vMenu];
    [vMenu setBackgroundColor:[UIColor grayColor]]; 


    iTime = 2;
    [self menuItem:vMenu menuButton:bMenu_time menuLabel:lMenu_time menuPosX:240+20 menuLenX:60 menuTagNum:102  menuText:[NSString stringWithFormat:  @"Hold: %d", iTime]];

    NSLog(@"\nPointer Outside: %@\n", lMenu_time); // <----- OUTSIDE is NULL ??
}

Ответы [ 2 ]

1 голос
/ 26 января 2012

Цель C, как и C, передается значением . Это означает, что если вы хотите изменить указатель, передав его функции, вам нужно передать указатель на указатель и использовать его.

В C это было бы что-то вроде:

void alloc128 (void **ptr) {
    *ptr = malloc (128);
}

Отобразив это в вашем конкретном случае, вы можете:

  • изменить menuBuild, чтобы передать адрес вещей, которые вы хотите изменить.
  • изменить функцию для получения значений указатель-указатель.
  • изменить функцию, чтобы разыменовывать значения указателя на точку, чтобы установить их правильно.
0 голосов
/ 26 января 2012

paxdiablo абсолютно прав, но в случае, если вы не уверены в синтаксисе для передачи по ссылке, вот что ваш код должен быть:

- (void) menuItem: (UIView*)vMenu  menuButton:(UIButton **)bMenu menuLabel: (UILabel **)lMenu  menuPosX: (double)posX   menuLenX: (double)lenX  menuTagNum: (int)tagNum menuText: (NSString*)txtMenu{

    *bMenu = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [*bMenu setFrame:CGRectMake(posX,0,lenX,25)];
    [*bMenu setTag: tagNum];
    [*bMenu addTarget:pSelf action:@selector(NewNumber:) forControlEvents:UIControlEventTouchUpInside];
    [vMenu addSubview:*bMenu];


    *lMenu = [[UILabel alloc] initWithFrame:CGRectMake(posX,0,lenX,25)];
    [*lMenu setBackgroundColor:[UIColor lightGrayColor]];
    [*lMenu setText:[NSString stringWithFormat:  txtMenu]];
    [*lMenu setFont:[UIFont systemFontOfSize:14 ]];
    [*lMenu setTextAlignment:UITextAlignmentCenter];
    [vMenu addSubview: *lMenu];

    NSLog(@"\nPointer Inside: %@\n", *lMenu); // <--------- INSIDE WORKS
}



- (void) menuBuild{     
    pSelf = self;
    theString = @"";


    vMenu = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,25)];
    [pSelf.view addSubview:vMenu];
    [vMenu setBackgroundColor:[UIColor grayColor]]; 


    iTime = 2;
    [self menuItem:vMenu menuButton:&bMenu_time menuLabel:&lMenu_time menuPosX:240+20 menuLenX:60 menuTagNum:102  menuText:[NSString stringWithFormat:  @"Hold: %d", iTime]];

    NSLog(@"\nPointer Outside: %@\n", lMenu_time); // <----- OUTSIDE is NULL ??
}

На что нужно обратить внимание:

  1. объекты, переданные по ссылке в параметрах метода, используют **
  2. для передачи адреса объекта одному из этих параметров, используйте & object при вызове метода
  3. для ссылки наобъект, который передается по ссылке, добавьте к переменной префикс *

Посмотрите, как iOS использует параметры ошибок в таких методах, как NSString initWithContentsOfFile: error: для большего количества примеров того, как используется этот подход.

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