EXC_BAD_ACCESS (code=1) только на iPad 2, iPhone4S и iPhone5

это беспокоило меня все утро, я искал весь этот веб-сайт и не могу найти никаких упоминаний об этой проблеме.

В моем проекте у меня есть 2 объекта с циклическими зависимостями, настроенными точно так же;

Класс A.h

@class ClassB;

@interface ClassA : NSObject {
    ClassB *foo;
}
@end

Класс A.m

#import "ClassB.h"

@implementation ClassA
    // Whatever goes here
@end

КлассB.h

@class ClassA;

@interface ClassB : NSObject {
    ClassA *foo;
}

@end

КлассB.m

#import "ClassA.h"

@implementation ClassB
    // Whatever goes here
@end

(КРЕДИТ - Разрешает ли Objective-C циклические зависимости?)

Я использовал эту технику в нескольких проектах, и до сих пор она работала совершенно нормально, каждый из объектов мог прекрасно обращаться к свойствам друг друга.

Пару дней назад я добавил несколько методов в ClassA и попытался вызвать их из ClassB, опять же, это сработало отлично ..... поэтому я подумал, что проблема в том, что я тестировал iPhone с различными версиями ОС, но все они были iPhone5S и выше. Сегодня я запустил проект на симуляторе iPad2, и он падает при запуске НЕКОТОРЫХ методов, то же самое происходит с симуляторами iPhone4S и iPhone5.

Например, методы, которые у меня есть в ClassA, это просто простые сеттеры;

-(void)setHomeButtonPageContents:(NSString*)contents Index:(int)index
{
    homeButtonPageContents[index]=contents;
}

Все они являются вариациями вышеперечисленного: некоторые настраивают цвета, некоторые настраивают шрифты, но на старых устройствах (iPad2, iPhone4S и iPhone5) некоторые работают, а некоторые нет.

Любые идеи?!?!


person Pretty Fly for a White Guy    schedule 02.12.2015    source источник
comment
Что такое трассировка стека? Где происходит сбой? Как определяется homeButtonPageContents? Есть ли у вас какие-либо квалификаторы (слабый, сильный и т. д.), свойства или переменные экземпляра? Все работает в одном потоке? Вы не даете нам много работы...   -  person jcaron    schedule 02.12.2015
comment
да все идет по одному кругу. NSString *homeButtonPageContents[9]; - это переменная экземпляра, определенная в ClassA, и сбой происходит при вызове метода в исходном потоке из ClassA. это отлично работает на 64-битных устройствах, но все, что ниже, не будет работать   -  person Pretty Fly for a White Guy    schedule 02.12.2015
comment
NSString *homeButtonPageContents[9]? Это очень необычный шаблон в Objective-C, и я, честно говоря, не уверен, что он действительно правильно поддерживается, особенно с ARC. Он также не обеспечивает никакой проверки диапазона (и вы тоже не проверяете его сами). Используйте NSMutableArray. И проверьте значение вашего индекса, фактическая ошибка может быть где-то еще...   -  person jcaron    schedule 02.12.2015


Ответы (1)


На всех ли устройствах установлена ​​одна и та же версия iOS? Возможно, на этих старых устройствах у вас нет версии iOS, которая может обрабатывать вызываемые вами методы.

person mahboudz    schedule 02.12.2015
comment
Привет, я проверил несколько разных версий iOS, и это определенно зависит от типа устройства, а не от ОС. Я также пробовал все разные устройства на симуляторе, и только iPad2, iPhone 4S и iPhone5 действуют. - person Pretty Fly for a White Guy; 02.12.2015
comment
Существуют и другие различия между типами устройств. Например, старые устройства не являются 64-битными. Если вы используете NSInteger на более новых устройствах, а затем предполагаете, что на более старых устройствах NSInteger имеет тот же размер, вы столкнетесь с проблемами. iPhone 5s — 64-битное устройство. - person mahboudz; 02.12.2015
comment
Я никогда не знал, что, спасибо, это, безусловно, дает мне новую область для исследований. Если я найду что-нибудь полезное, я опубликую здесь, но пока мой код все еще работает (по крайней мере, для старых устройств) :) - person Pretty Fly for a White Guy; 02.12.2015
comment
Я столкнулся с этим в двух ситуациях: 1. Я получил порядковые номера с одного устройства и передал их в UITableView на другом устройстве. Одно устройство было 64-битным, а другое 32-битным. Я бы предположил, что NSIntegers были 4 байта, и одно или другое устройство вело бы себя неправильно, потому что иногда вместо этого мне нужно было обрабатывать 8 байтов. 2. Значения UIColor для отдельных RGB - это CGFloat, которые имеют разные размеры до 32/64 бит. - person mahboudz; 02.12.2015
comment
Я думаю, вы могли бы что-то там понять, индекс, который я передаю, представляет собой простые целые числа, я проведу небольшое тестирование через некоторое время и дам вам знать, если вы правы, у меня такое ощущение, что вы правы !! - person Pretty Fly for a White Guy; 02.12.2015