2010-04-26 2 views
1

Short & сладкий вариант моего последнего вопроса в свете новой информации.UIView drawRect; переменные класса вне сферы действия

У меня есть UIVIew с методом init и drawrect (и другой нитью и связкой других вещей, но я буду держать его коротким & сладким).

Все переменные класса, которые я выделяю, и init в методе init() инициализируются вне области/nil/0x0 в методе drawRect, и я не могу получить к ним доступ.

Например,

В интерфейсе:

NSObject* fred; 

В реализации:

-(id)init 
{ 
    if(self == [super init]) 
    { 
     fred = [[NSObject alloc] init]; 
    } 

    return self; 
} 

-(void)drawRect:(CGRect)rect 
{ 
    NSLog(@"Fred is retained %i times",[fred retainCount]); //FAIL 
    NSLog(@"But his variable is actually just pointing at uninitialised 0x0, so you're not reading this in the debugger because the application has crashed before it got here." 
} 

Должен добавить, что инициализации вызывается перед тем DrawRect также. У кого-нибудь есть идеи?

ответ

0

IS it? Вы на самом деле звонили NSLog и проверено? Потому что я думаю, что он инициализирован initWithFrame: или что-то в этом роде.

Редактировать: Некоторое короткое тестирование показывает, что проблема заключается не в том, что fred неинициализирован; если бы это было; вы не получите никакой ошибки, так как отправка сообщений на nil не приведет к сбою. (Переменные экземпляра инициализируются до nil). Фактически, происходит то, что где-то вдоль линии fred выпущен; заставляя указатель указывать на мусор, а не на объект. (Вернее, искаженный или мусорный объект, который больше не может получать сообщения.)

Код, который вы предоставили, недостаточно, чтобы найти ошибку; вам придется вставить больше (и точный код, используемый в вашем приложении).

+0

Если он не называет init явно, что возможно. Но инициализация переменной не связана с проблемами области - scope подразумевает, что переменная не объявлена ​​правильно. –

+0

Он вводит в заблуждение область действия с объектом жизни. Объекты какао не умирают от оставления объема. И вызывать 'init' явно в подклассе' UIView'/'NSView', это, как вы говорите, Bad Idea ™. Если fred равно нулю, он никогда не инициализировался; если он был создан и умер; Фред укажет на мусор. –

+0

Я использовал точки останова, чтобы подтвердить выполнение init, и что это до drawRect. – Tobster

Смежные вопросы