Почему я не могу сохранить UIView-Pointer?

Я пытаюсь передать UIView другому классу, который работает, но я не могу сохранить указатель...

в моем файле .h я объявляю представление:

UIView *someView;

Я добавляю свойство

@property (nonatomic, retain) UIView *someView;

А в .m-файле синтезирую свойство

@synthesize someView;

Затем у меня есть способ установить представление (которое также установлено в файле .h - поверьте мне :):

-(void)makeViewPointer:(UIView *)myView{
    someView = [[UIView alloc] init];
    someView = myView;

    for(UIView *aView in someView.subviews){

        NSLog(@"tag %d", aView.tag);

    }
}

Пока все работает. Когда я регистрирую someView, я получаю указатель, и все подпредставления доступны.

Я вызываю этот метод из другого класса, который работает нормально.

СЕЙЧАС - у меня есть IBAction, настроенный на то, чтобы что-то делать с этим представлением после нажатия кнопки

-(IBAction)doSomething:(id)sender{
    NSLog(@"show the view %@", someView);

    for(UIView *aView in someView.subviews){  // doesn't output anything

        NSLog(@"tag %d", aView.tag);

    }

}

В этот момент someView-var снова пуст - ПОЧЕМУ????

Я предположил, что когда я использую @property (неатомарное, сохраняемое), переменная сохраняется автоматически?

Я также попытался сохранить переменную при инициализации:

someView = [[UIView alloc] retain];

не работает

or

someView = [[UIView alloc] init];
[someView retain];

тоже не работает...

Что я делаю не так???

Спасибо за любую помощь!


person Urs    schedule 22.06.2010    source источник


Ответы (3)


Несколько вещей.

someView = [[UIView alloc] init];
someView = myView;

Вышеупомянутое неверно. Сначала вы создаете новый экземпляр UIView и назначаете его someView. Затем вы назначаете myView на someView. Это вызывает утечку памяти, потому что вы никогда не освобождали someView, вы просто переназначали его.

Я думаю, что вы пытаетесь сделать следующее:

[someView release];
someView = [myView retain];

Затем вы должны убедиться, что вы отпустите someView, когда вы полностью закончите с ним.

Это то, что будет делать @property (nonatomic, retain), но чтобы использовать это, вам нужно сделать:

[self setSomeView:myView];
person Tom Irving    schedule 22.06.2010
comment
Спасибо, Том - это имеет смысл... однако - это не работает... Я использую: -(void)makeViewPointer:(UIView *)myView{ [self setSomeView:myView]; } но при следующем обращении к «someView» - опять пусто... ??? Черт - person Urs; 22.06.2010
comment
Вы уверены, что класс сохраняется? - person Tom Irving; 23.06.2010

Если вы не используете нотацию с собственной точкой, вы не сохраняете объект, назначенный свойству.

Вам нужно использовать:

self.someView = myView;

и

for(UIView *aView in self.someView.subviews){

Самозапись вызывает синтезированные методы доступа, которые управляют сохранением. Если вы не используете self, ничего не сохраняется должным образом.

person TechZen    schedule 22.06.2010
comment
Спасибо, TechZen... Пробовал - но не работает... Забыл упомянуть, что уже пробовал запись с точками... Странно... - person Urs; 22.06.2010
comment
Вы можете попробовать опубликовать свой фактический код. Наверное, где-то не хватает детали. Нет причин, почему то, что вы пытаетесь сделать, не работает. - person TechZen; 23.06.2010

ОК - я думаю, я сделал все настолько неправильно, насколько это возможно ;)

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

Цель состояла в том, чтобы всплывающее окно накладывалось, но я не хотел помещать это представление в отдельный файл пера. Вот почему я просто добавил класс из библиотеки классов.

Я, наконец, сдался и переместил оверлей в отдельный кончик, сделал свой класс контроллером представления и... все работает нормально...

В любом случае, спасибо за подсказки, ребята, я многому научился...

person Urs    schedule 23.06.2010