Почему я не могу сохранить UIView-Pointer? - PullRequest
0 голосов
/ 22 июня 2010

Я пытаюсь передать 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 (nonatomic, retain), переменная сохраняется автоматически?

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

someView = [[UIView alloc] retain];

не работает

или

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

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

Что, черт возьми, я делаю неправильно ???

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

Ответы [ 3 ]

0 голосов
/ 22 июня 2010

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

Вам необходимо использовать:

self.someView = myView;

и

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

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

0 голосов
/ 23 июня 2010

ОК - полагаю, я сделал все как можно хуже;)

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

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

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

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

0 голосов
/ 22 июня 2010

Мало вещей.

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

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

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

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

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

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

[self setSomeView:myView];
...