Objective-C: self = nil не устанавливает экземпляр в нулевое значение - PullRequest
1 голос
/ 21 июля 2011

У меня есть следующий код, довольно простой:

//SecondViewController.m
if(contentRvController==nil){
    contentRvController = [[ContentView alloc] 
    initWithNibName:@"ContentView" bundle:nil]; //ContentView is a custom UIViewController
    ....
    [self.view addSubview:contentRvController.view];
}
else{
    contentRvController.view.hide = YES;
    [contentRvController release];
    contentRvController = nil;
}

Обычно, когда код запускается с помощью кнопки, если UIViewController не существует, создайте его и отобразите его (он должен отображаться в главном большом рабочем столе, это представление SecondViewController). Если он уже открыт, закройте его и удалите на свободные ресурсы.

Теперь contentRvController - это экземпляр ContentView, пользовательский UIViewController. У него есть свой собственный закрытый UIButton, который IBAction это:

//ContentView.m
- (IBAction) closeView {
    self.view.hidden = YES;
    [self release];
    self = nil;
}

Теперь, когда запускается из SecondViewController, выпуск contentRvController работает правильно (или мне так кажется), представление появляется и исчезает. Но когда нажата кнопка закрытия ContentView, она также закрывает представление, но при попытке открыть ее снова if(contentRvController==nil) возвращает FALSE, поэтому я должен дважды нажать кнопку, чтобы выполнить ее, чтобы снова отобразить ContentView.

Мне кажется, что self = nil; работает не так, как contentRvController = nil;, хотя предполагается, что оба указывают на одно и то же место, и я потерян с этим.

¿Есть идеи? Приветствия из Мексики

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Они работают так же, но они не делают то, что вы думаете, они делают.= не влияет на объект;это влияет на переменную, указывающую на объект.Установка одной переменной для указания значения nil не изменит значения любых других переменных в вашей программе.Аналогично:

int a = 5;
int b = a;
b = 6;
printf("A is %d and B is %d\n", a, b);

При этом будет напечатано «A равно 5, а B равно 6» - потому что установка B на новое значение не меняет значение A.

1 голос
/ 21 июля 2011

Ни один объект не должен освобождать себя. Обычный способ избавиться от объекта - реализовать -dealloc, где вы освобождаете любые ivars, а затем вызываете [super dealloc] следующим образом.

- (void) dealloc; {  

[someIvar release];  
[someOtherIvar release];  
[super dealloc];  
}  

Вам определенно следует сделать шаг назад и ознакомиться с жизненным циклом объекта в Objective-C, иначе вас ждет целый мир ошибок. Apple View Controller Руководство по программированию для iOS совсем не длинное. Просто Google для этого названия. Избавь себя от хлопот.

...