Синглтоны в Objective-C для хранения и доступа к переменным всей программы. Несколько вопросов - PullRequest
3 голосов
/ 05 февраля 2010

Я использую класс 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?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2010

Проблема в том, как вы используете синглтон. Общая идея заключается в том, что вы не retain или release ни одного объекта-одиночки, потому что существует только один экземпляр, а реализация синглетонов в Apple закодирована таким образом, что вы не сможете . Это вызывает некоторые проблемы, которые Питер Хоси написал в блоге о с лучшей реализацией синглтона Cocoa.

Предупреждения о том, что в журналах Analyzer просто указывается, что вы «не должны» сохранять или освобождать одноэлементный объект; в силу того, что вы звоните [MyGizmoClass sharedManager], вы все равно не должны выпускать (следуя рекомендациям по управлению памятью какао ).

0 голосов
/ 05 февраля 2010

Вы не должны выпускать myGizmoClass. Когда вызывается [MyGizmoClass sharedManager], возвращенный объект не сохраняется. Поскольку это общий объект, его единственным владельцем является его класс, за освобождение которого отвечает другой объект, если только он не сохранил его.

Взгляните на это краткое руководство от Apple по использованию одноэлементных объектов в коде Objective-C.

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