Сбой приложения [iOS]

#ios

Вопрос:

в моем симуляторе iPhone для Mac (симулятор iPhone 4.0) я запускаю свое приложение без проблем, но когда я меняю его на другой Mac, на котором работает симулятор iPhone 4.2, он отключается при нажатии кнопки где-то в приложении, может ли версия отладчика (4.0 и 4.2) быть причиной потенциального сбоя ? thx заранее :))

Редактировать

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

 - (void)viewDidLoad {
    ((UILabel *)[[[[[[switchCommerce subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"oui";
        ((UILabel *)[[[[[[switchCommerce subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"non";
        ((UILabel *)[[[[[[switchStationDeLavage subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"oui";
        ((UILabel *)[[[[[[switchStationDeLavage subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"non";
        [rayonDeRechercheSlider setValue:35 animated:YES];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.0];
        CGAffineTransform transform=CGAffineTransformMakeTranslation(0,480);
        pickerViewTypeCarburant.transform=transform;
        pickerViewNomStation.transform=transform;
        [UIView commitAnimations];
        [super viewDidLoad];
        typeCarburantTextField.delegate=self;
        nomDeStationTextField.delegate=self;
        pickerArrayTypeCarburant=[[NSMutableArray alloc] initWithObjects:@"Sans Plomb 95",@"Gazole",@"Super Gazole",@"GNV",@"Sans Plomb 98",@"SP95-E10",@"E85",nil];
        pickerArrayNomStation=[[NSMutableArray alloc] initWithObjects:@"TOTAL",@"SHELL",@"ESSO",@"CARREFOUR",@"BP",@"AGIP",@"CASINO",@"LECLERC",@"AUCHAN",@"ELF",@"AVIA",@"SUPER U",nil];//added
    }
 

Комментарии:

1. Эпическое использование квадратных скобок там.

2. Какое сообщение об ошибке отображается отладчиком при сбое? Не могли бы вы включить обратную дорожку?

3. привет, что вы имеете в виду, пожалуйста, под «Эпическим использованием квадратных скобок» ??

4. @Малек: Я предполагаю, что массивы » pickerArrayTypeCarburant » и » pickerArrayNomStation » являются свойствами вашего класса?

5. @Malek: Поскольку вам нужно иметь возможность сохранять массивы, используя эти переменные экземпляра, я бы сказал, что вы должны объявить их как свойства. Вам может быть полезно прочитать документацию Apple по языку программирования Objective_C: Язык программирования Objective-C (см. раздел «Объявленные свойства»). Я отредактировал свой ответ ниже, чтобы показать, как вам, вероятно, следует объявить ивары массива.

Ответ №1:

Одна из потенциальных проблем в вашем коде заключается в том, что вы, похоже, присваиваете свойствам изменяемого массива ( pickerArrayTypeCarburant amp; pickerArrayNomStation ) без использования self. обозначения. Это означает, что массивы назначаются без использования retain семантики (при условии, что ваше @property объявление для массивов указано использовать retain ).

Это приводит к тому, что при попытке доступа к этому массиву позже в коде вы обнаружите, что массив не был сохранен, и, скорее всего, вы получите какое-то предупреждение о памяти. Попробуйте это вместо этого:

 self.pickerArrayTypeCarburant=[[NSMutableArray alloc] initWithObjects:@"Sans Plomb 95",@"Gazole",@"Super Gazole",@"GNV",@"Sans Plomb 98",@"SP95-E10",@"E85",nil];
self.pickerArrayNomStation=[[NSMutableArray alloc] initWithObjects:@"TOTAL",@"SHELL",@"ESSO",@"CARREFOUR",@"BP",@"AGIP",@"CASINO",@"LECLERC",@"AUCHAN",@"ELF",@"AVIA",@"SUPER U",nil];
 

Трудно сказать, решит ли это вашу проблему, так как я не знаю, какая ошибка возникает, однако, если это связано с памятью, это может быть виновником.

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

Редактировать:

В ответ на ваш комментарий относительно свойств, ваш файл заголовка, вероятно, должен объявить ваши NSMutableArrays следующим образом:

Ваш класс.h

 @interface YourClass {
    NSMutableArray *pickerArrayTypeCarburant;
    NSMutableArray *pickerArrayNomStation;
}

@property (nonatomic, retain) NSMutableArray *pickerArrayTypeCarburant;
@property (nonatomic, retain) NSMutableArray *pickerArrayNomStation;


// Any method names here...


@end
 

И в верхней части вашего .m файла, прямо под @implementation строкой:

 @synthesize pickerArrayTypeCarburant, pickerArrayNomStation;
 

@synthesize Деталь автоматически создаст необходимые средства доступа и мутаторы для ваших свойств на основе информации, которую вы предоставляете в строках @property . В этом случае я определил, что свойства должны использовать семантику сохранения, что означает, что когда вы присваиваете значение своему свойству, используя self. (т. Е. self.pickerArrayNomStation = anArray; ) массив, который вы ему назначаете, будет автоматически сохранен вашим свойством. Убедитесь, что вы включили параметр self. при назначении свойству, использующему сохранение, так как именно это указывает на использование метода сгенерированного мутатора, а не просто назначение переменной экземпляра без сохранения.

Кстати, убедитесь, что при создании сохраненных свойств таким образом вы вызываете [myProperty release]; dealloc метод и (предполагая, что ваш класс является контроллером представления…) self.myProperty = nil в своем viewDidUnload методе. Это гарантирует, что все сохраненные объекты будут освобождены должным образом, когда ваши представления и контроллеры представлений больше не понадобятся.

Если вам нужна дополнительная информация об этом, документация Apple-ваш друг. Я нашел их руководства по программированию действительно полезными, когда начинал. Руководство, которое я связал с вами в своем комментарии под вашим ответом, является хорошим для начала.

Надеюсь, это поможет.

ПРАВКА 2

Не уверен, поможет ли это, но я иногда обнаруживал, что назначение массивов таким образом немного безопаснее… в нижней части метода viewDidLoad, где вы присваиваете свойству массива, измените код на этот:

 NSMutableArray *newArrayTypeCarburant = [[NSMutableArray alloc] initWithObjects:@"Sans Plomb 95",@"Gazole",@"Super Gazole",@"GNV",@"Sans Plomb 98",@"SP95-E10",@"E85",nil];
NSMutableArray *newArrayNomStation = [[NSMutableArray alloc] initWithObjects:@"TOTAL",@"SHELL",@"ESSO",@"CARREFOUR",@"BP",@"AGIP",@"CASINO",@"LECLERC",@"AUCHAN",@"ELF",@"AVIA",@"SUPER U",nil];
self.pickerArrayTypeCarburant = newArrayTypeCarburant;
self.pickerArrayNomStation = newArrayNomStation;
[newArrayTypeCarburant release];
[newArrayNomStation release];
 

Комментарии:

1. я проверю это и скажу вам, что произойдет, пожалуйста, оставайтесь в курсе моего поста :)))) thx

2. когда я использую оператор self, он выдает мне ошибку : ошибка: объект не может быть установлен — либо свойство только для чтения, либо сеттер не найден

3. @Malek: Теперь я отредактировал свой ответ, чтобы включить информацию о том, как вы должны назначить свое свойство, чтобы оно создавало для вас сеттер и заставляло ваше свойство использоваться retain при присвоении ему значений.

4. Привет, СтуДев, я понял твою идею и сделал так, как ты сказал, все было в порядке, но сбой всегда происходит на Mac моего босса, он сказал мне, что у него нет сообщений об обратных следах !!!!!!! пожалуйста,помогите мне, все управление памятью в порядке, и доступ к этому представлению, содержащему приведенный выше код (из любого представления), приводит к сбою, большие сомнения в методе viewDidLoad, потому что сбой происходит, когда представление собирается появиться, я прав ??

5. @Малек: Где — то должна быть какая-то информация о сбое-что именно происходит, когда приложение выходит из строя? Вы пробовали ввести «bt» в консоль отладки, чтобы отобразить обратный путь? В противном случае попробуйте установить значение NSZombieEnabled на «ДА» в переменных среды ваших приложений — эти типы сбоев при неправильном доступе не могут отображать сообщения консоли. Я также добавил еще одно изменение в свой ответ выше — попробуйте. Не зная больше о крушении, я не могу предложить ничего большего — вы пробовали устанавливать точки останова, чтобы найти точную точку крушения?