Я использую класс Apple MyGizmoClass Singleton для «программных переменных сеанса» и мне это нравится! Однако, когда я запускаю «Построить и проанализировать», это дает странные результаты. Возможно, мое использование неверно (это работает, но может работать из-за нестабильного побочного эффекта). Вот пример.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int ct = 0;
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
ct = [[myGizmoClass searchResultsForResortLocation] count];
[myGizmoClass release];
NSLog(@"ct: %d",ct);
return ct;
}
или
- (void)viewWillAppear:(BOOL)animated {
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
//self.navigationItem.rightBarButtonItem = self.editButtonItem;
NSMutableString *which_resort = [[NSMutableString alloc] init];
NSMutableString *category_code = [[NSMutableString alloc] init];
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
...
which_resort = [self which_resort_location_are_we_in];
...
[myGizmoClass setWhich_resort:which_resort];
int useDebugMode = [myGizmoClass useDebugMode];
...
[myGizmoClass release];
[which_resort release];
[category_code release];
[super viewWillAppear:animated];
}
Опять же, это использование может быть ОТКЛЮЧЕНО, но я думал, что каждый метод, который я использовал значение из синглтона, я должен был сделать:
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
и
[myGizmoClass release];
НО я получаю эти ошибки во время анализа:
/ Пользователи / jgobble / Документы / ProgramName / Классы / ResortsListViewController.m: 495: 2
Неверный декремент ссылки
количество объектов не принадлежит
эта точка звонящего
/Users/jgobble/Documents/ProgramName/Classes/ResortsListViewController.m:493:30
Метод возвращает объект Objective-C
с счетом удержания +0 (не владеющий
ссылка)
/Users/jgobble/Documents/ProgramName/Classes/ResortsListViewController.m:495:2
Неверный декремент ссылки
количество объектов не принадлежит
эта точка звонящего
Теперь, пожалуйста, примите это во внимание: я звоню так:
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
в начале каждого метода нужна "переменная сеанса", а затем вызывается:
[myGizmoClass release];
в конце этого метода ДО возврата результата (если я возвращаю результат из этой функции.
Разве я не должен это делать?
Это ЕДИНСТВЕННАЯ вещь, которую анализатор (слава богу) сообщает о неверной программе. Я не знаю, должен ли я игнорировать это. Я не знаю, делаю ли я звонки в нужном месте.
Вот еще один вопрос, который меня беспокоит: это работает или все последующие вызовы * myGizmoClass что-то портят?
-(void) function_a {
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
[myGizmoClass setC:1];
int result_b = [self function_b];
printf("Addition result is: %d", result_b);
[myGizmoClass release]
}
-(int) function_b {
MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
int b = 0;
b = b + [myGizmoClass c];
[myGizmoClass release]
return b;
}
(я не проверял код выше)
Другими словами, что-то не так с вызовом MyGizmoClass * myGizmoClass = [MyGizmoClass sharedManager]; из function_b, когда вы еще не выпустили MyGizmoClass * myGizmoClass = [MyGizmoClass sharedManager]; из function_a?