UITextView alloc завершает работу приложения на iOS4 - PullRequest
1 голос
/ 10 сентября 2010

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

РЕДАКТИРОВАТЬ: я попытался изменить положение этого оператора и поместил несколько операторов журнала для проверки, и я мог подтвердить, что приложение падает именно на этой строке.

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

    //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

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

Вывод на консоль:

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

          warning: Unable to restore previously selected frame.

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

Кто-нибудь может помочь, пожалуйста?

Спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

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

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

Далее, вы не должны получать прямой доступ к своим иварам.Всегда используйте аксессоры.Всегда.(За исключением, возможно, в 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 голосов
/ 10 сентября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...