Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > Неправильный доступ к объектам?


Автор: Dimanoss 3.9.2013, 19:17
В проекте есть класс Singleton , по задумке в нём должны лежать переменные, используемые разными классами.  И вот что получается.  Если обращаюсь из класса А, что-либо сохраняю, потом так же нормально читаю.  Если же сохраняю классом А, а читать пытаюсь классом Б, получаю какую-то фигню. Например: NSPoint: {653, 72} или <CABasicAnimation: 0x71c0e40> .

Если я правильно понимаю - каждый класс создаёт-таки свой экземпляр Singleton?  Отсюда все безобразия?

Автор: Bitter 3.9.2013, 23:21
Нет, синглтон на то и синглтон чтобы он создавался один единственный раз и использовался всеми. Читайте паттерны, хотя бы в википедии.

Автор: Dimanoss 4.9.2013, 11:42
тогда в чём дело?  Неправильное объявление синлтона?  у меня сейчас так выглядит:

Код

static MySingleton *sMySingleton = nil;

+(MySingleton *) sharedInstance
{
    @synchronized(self)
    {
        if (sMySingleton == nil) sMySingleton = [NSAllocateObject([self class], 0, NULL) init];        
    }
    return sMySingleton;
}

Автор: Bitter 4.9.2013, 13:24
объявление выглядит вполне нормально, а в чем дело, так это знает только ХКод

Автор: Dimanoss 4.9.2013, 18:14
проблемы возникают при вызове

Код

[[MySingleton sharedInstance] testAllVars]; 


тут я получаю или белиберду, или крэш (EXC_BAD_ACCESS code=1).  Функция testAllVars безобидная, всего лишь в логи выводит все нужные переменные.  Причём проблемы возникают не при первом вызове, т.е. - первый раз всё нормально проходит...

Автор: Bitter 5.9.2013, 00:00
ну видимо все ваши нужные переменные и приводят к крэшу

Автор: Dimanoss 5.9.2013, 12:48
уверен, переменные в полном порядке.  Первый раз же нормально всё, после первого обращения все переменные так в синглтоне и остаются...

Автор: Bitter 5.9.2013, 13:05
Трудно что либо сказать по вашему вопросу, я ж не телепат. Бывает что BAD_ACCESS вызван обращением к удаленному из памяти объекту (то есть к зомби). Попробуйте включить зомби в проекте и посмотрите что выводится в консоли при крэше
На картинке обратите внимание на галочку
user posted image

Автор: Dimanoss 5.9.2013, 13:39
-[CFString respondsToSelector:]: message sent to deallocated instance 0x2d6b7ff0

Автор: Bitter 5.9.2013, 14:06
это значит, что вы используете строку которая удалилась из памяти
Вы используете ARC?

Автор: Dimanoss 5.9.2013, 14:32
Цитата(Bitter @ 5.9.2013,  14:06)
Вы используете ARC?

никак нет-с.  Постойте, на то ведь он и Синглтон, чтобы не удаляться....

Автор: Bitter 5.9.2013, 14:56
если вы не используете ARC, то вы безнадежно отстали. Вы не используете сторибоарды, вы не используете ARC, скажите еще что вы под DOS пишете.
Еще раз - удаляется не синглтон, а какая-то переменная типа NSString. Какая это только вам известно. Ищите где у вас работа со строками, как вы их храните и тд

Автор: Dimanoss 5.9.2013, 15:22
Цитата(Bitter @ 5.9.2013,  14:56)
...вы безнадежно отстали. Вы не используете сторибоарды, вы не используете ARC...

Не, ну, конечно, мне бы застрелиться нужно, но это проблемы не решит.  Я уже как-то оправдывался, почему я все последние причиндалы не использую.  Ну вот сложилось так, последующие проекты (если будут) по другому буду делать.

Добавлено через 5 минут и 52 секунды
Цитата(Bitter @ 5.9.2013,  14:56)
Еще раз - удаляется не синглтон, а какая-то переменная типа NSString. Какая это только вам известно. Ищите где у вас работа со строками, как вы их храните и тд

Просто в классе Singleton объявлена переменная 
Код

@property (nonatomic, strong) NSString* userName;
, к ней же и пытаюсь обратиться.  Нигде в коде попыток развоплотить её не предпринимаю, так что даже и не знаю, где собака порылась.   На двадцатый раз перерываю код, и ничего в голову не приходит...

Автор: Bitter 5.9.2013, 15:36
как вы инициализируете эту переменную?

Автор: Dimanoss 5.9.2013, 15:54
пробовал и через сеттер, и напрямую.   Даже self->userName вспомнил.  Устанавливается-то она нормально, но после того, как другой ViewCotroller загружается, всё как-то тазиком прикрывается

Автор: Dimanoss 5.9.2013, 16:15
чтоб не ходить около - весь проект (со всем мусором, само собой)

http://sivoronov.de/sklad/files/SV.zip

Автор: Bitter 5.9.2013, 17:33
и как в нем добиться краша?

Автор: Dimanoss 6.9.2013, 09:13
итак, первый ВьюКонтроллер - синхронизация  базы пользователей/клиентов.  Затем он грузит Логин-Контроллер (ах, да - если не ковыряли БД - логин:aaa, пароль:bbb).  Потом грузится контроллер, где выбирается клиент.  До этого момента всё работает нормально.  Затем, после выбора клиента из списка грузится контроллер со списком категорий.  И вот тут уже программулина вылетает...

Автор: Bitter 6.9.2013, 11:21
ну в общем у меня ваш логин пароль не подходит, честно говоря нет никакого желания разбираться почему

Автор: Dimanoss 6.9.2013, 11:33
Ну что ж, и на том спасибо.  Будем искать обходные пути... ("Так выпьем же за то, чтобы наши возможности всегда совпадали с нашими желаниями!")

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)