2010-09-10 2 views
1

Я абсолютно в тупике. Мое правильно работающее приложение [на iOS < = 3.1] рушилось на iOS4. Когда я попытался отладить его, я увидел, что он сбой в этой строке:UITextView распределяет приложения на iOS4

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

Это часть моего кода:

//Various allocations here like 

lblForAttachingPhoto = [[UILabel alloc]initWithFrame:CGRectMake(235, 105, 40, 20)]; 
lblForAttachingPhoto.backgroundColor = [UIColor grayColor]; 
[lblForAttachingPhoto setText:@"140"]; 
[lblForAttachingPhoto setTextAlignment:UITextAlignmentCenter]; 

btnAttachPhoto = [UIButton buttonWithType:UIButtonTypeCustom]; 
btnAttachPhoto.frame = CGRectMake(275, 105, 20, 20); 
btnAttachPhoto.autoresizesSubviews = YES; 
btnAttachPhoto.clipsToBounds = YES; 
[btnAttachPhoto setImage:[UIImage imageNamed:@"arrow.jpg"] forState:UIControlStateNormal]; 
[btnAttachPhoto addTarget:self action:@selector(attachPhoto) forControlEvents:UIControlEventTouchUpInside]; 

viewForAttaching = [[UIView alloc]init]; 
viewForAttaching.frame = CGRectMake(5, -340, 310, 140); 


for(NSInteger e=0;e<[_appDelegate.genericArray count];e++) 
{ 
    [genericArray addObject:[_appDelegate.genericArray objectAtIndex:e]]; 
} 

for(NSInteger f=0; f< [_appDelegate.category_type count]; f++) 
{ 
    [category_type addObject:[_appDelegate.category_type objectAtIndex:f]]; 
} 

txtVw = [[UITextView alloc]init];  //txtVw is a textview 

Но несмотря на позицию заявления заявления распределения TextView, это делает сбой приложения.

Консоль вывода:

  Program received signal: “EXC_BAD_ACCESS”. 
      warning: check_safe_call: could not restore current frame 

      warning: Unable to restore previously selected frame. 

Возможно ли это? Я также реализую протокол UITextViewDelegate.

Может ли кто-нибудь помочь?

Thanx заранее.

+0

Можете ли вы опубликовать другой код, связанный с вашим txtVw? Это объявлено в .h? Если вы объявляете это как свойство, вы его синтезируете? – MishieMoo

+0

Нет, я не объявил это как свойство, поэтому не синтезировал его. Этот код в основном находится в viewDidLoad моего класса. – neha

ответ

2

Маловероятно, что авария на самом деле связана с инициализацией UITextView. Я действительно подозреваю, что линия над ним в цикле for(). У вас очень непоследовательное управление именами и памятью, и это опасно в ObjC.

Прежде всего, дайте переменным согласованные имена. category_type звучит как переименование, но, похоже, это NSMutableArray. Это имя именования убьет вас в ObjC; вы должны следить за тем, что происходит, потому что компилятор часто не улавливает несоответствия типов. Вы должны иметь такое имя, как categoryTypes.

Далее, вы не должны напрямую обращаться к своим ivars. Всегда используйте устройства доступа. Всегда. (За исключением, возможно, dealloc, там есть противоречия.) Это # 1 способ избежать EXC_BAD_ACCESS. Вы явно не сохраняете что-то правильно. Аксессоры защищают от этого.

Вы действительно хотите добавить _appDelegate.genericArray в genericArray? Или вы действительно хотите сделать genericArray копией _appDelegate.genericArray? Или вы просто хотите genericArray указать на _appDelegate.genericArray? Если вы хотите получить копию, просто скопируйте его:

self.genericArray = [NSMutableArray arrayWithArray:self.appDelegate.genericArray]; 

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

Вы также должны нажать «Cmd-Shift-A» и позволить статическому анализатору искать ошибки для вас.

+0

Роб, я ценю вашу помощь. Thanx для приятного объяснения. Но это «не решило мою проблему». Он все еще рушится на той же линии. И независимо от того, где я пишу эту строку, программа там сама врезается, например, если я пишу ее как первый оператор в моем представленииDidLoad, тогда он сбой там без обработки каких-либо дальнейших утверждений. Это «действительно расстраивает». – neha

+1

Хорошо, сломайте его. Начните с "[UITextView alloc]". Не назначайте его переменной. Затем попробуйте [[UITextView alloc] init]. Затем попробуйте присвоить переменную «nil». Затем попробуйте назначить текстовое представление переменной стека, а затем назначьте переменную стека ivar (убедитесь, что она компилируется в Debug, а не Release, поэтому это не оптимизировано). –

0

Необходимо сохранить переменную txtVw. Проблема в том, что к тому времени, когда ваш код получит назначение объекта txtVw, приложение «забудет» его. Попробуйте это, чтобы исправить это. В вашем методе инициализации сделать:

txtVw = [[UITextView alloc]init]; 
[txtVw retain]; 

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

Предполагаю, что это ваша проблема. если это не сработает, тогда скажите мне, и я еще раз посмотрю.

+0

+ alloc уже сохранил txtVw. Там вообще нет причин дополнительно удерживать его здесь. Если вы назначаете объект, сгенерированный с помощью + alloc, на сохраненный ivar, вам также необходимо автообновить его или вы будете течь. –

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