#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 на «ДА» в переменных среды ваших приложений — эти типы сбоев при неправильном доступе не могут отображать сообщения консоли. Я также добавил еще одно изменение в свой ответ выше — попробуйте. Не зная больше о крушении, я не могу предложить ничего большего — вы пробовали устанавливать точки останова, чтобы найти точную точку крушения?