Проверка свойства singleton со значением nil приводит к ошибке - PullRequest
0 голосов
/ 02 февраля 2010

Когда я проверяю одноэлементное свойство, равное nil, оно убивает мое приложение. Но когда я проверяю nil в свойстве экземпляра класса, все работает нормально.

Это прекрасно работает:

self.MyProperty == nil

но это убьет приложение с «EXC_BAD_ACCESS»

[MySingleton sharedManager].SomeProperty != nil

Какая разница с синглтоном, который я не могу проверить на ноль?

Вот одноэлементная реализация:

.h файл:

@interface MySingleton : NSObject {
    NSString * SomeProperty;
}
@property (nonatomic, copy) NSString * SomeProperty;
+(MySingleton *)sharedManager;
@end

.m файл:

#import "MySingleton"

static MySingleton *sharedManager = nil;

@implementation MySingleton
@synthesize SomeProperty;

- (void)dealloc {
     [SomeProperty dealloc];
     [super dealloc];
}

+(MySingleton *)sharedManager
{       
    if (!sharedManager){
         sharedManager = [[MySingleton alloc] init];
    }
    return sharedManager;   
}

Это то, что я нахожу в консоли, когда пытаюсь назначить что-то SomeProperty:

MyApp(51363,0xa0389500) malloc: *** mmap(size=2147487744) failed (error code=12)
*** error: can't allocate region  
*** set a breakpoint in malloc_error_break to debug
Current language:  auto; currently objective-c  
(gdb) break malloc_error_break  
Note: breakpoints 6 and 8 also set at pc 0x929c2072.
Breakpoint 11 at 0x929c2072  
(gdb) continue  
(gdb) po [MySingleton sharedManager].SomeProperty
Cannot access memory at address 0x0  
(gdb) po [MySingleton sharedManager]
<Session: 0x1938fa0>

Я получаю выше только при попытке назначить. При попытке чтения переменной происходит сбой.

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

Учитывая это:

- (void)dealloc {
[someKey dealloc];
[super dealloc];
}

И какой-то другой код, я бы вышел на конечность и сказал, что, вероятно, есть другие проблемы с кодом, комбинация которых приводит кна проблему, на которую вы намекали.В частности, вы никогда не должны звонить -dealloc напрямую (кроме [super dealloc]).Если у вас это есть в других частях вашего кода и он выполняется, он может легко вызвать описанный вами симптом.

Если вы хотите получить более конкретный ответ, опубликуйте обратный след аварии.1011 *

Установите точку останова, как указано, а затем перезапустите приложение .Как только появляется это сообщение об ошибке, все ставки отключены, так как ваше приложение уже подключено.Вам нужен обратный след того, когда этот вызов сделан.

Однако происходит то, что что-то просит mmap () отобразить в 2 ГБ адресного пространства.Может быть коррупция.Может быть плохой код.

1 голос
/ 02 февраля 2010

Вы когда-нибудь выпускали синглтон? Похоже, что возвращаемый вами экземпляр больше не действителен. Я бы переопределил «release», чтобы синглтон ничего не делал, и посмотрел бы, если у вас все еще есть проблема ...

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

Измените этот код.

- (void)dealloc {
     [SomeProperty dealloc];
     [super dealloc];
}

Как это

- (void)dealloc {
     [SomeProperty release];
     [super dealloc];
}

НЕ ВЫЗЫВАЙТЕ метод dealloc. Кроме [супер сделки]

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

Скорее всего, объект любого типа, который возвращает ваш метод +sharedManager, не является допустимым объектом Objective C, и попытка получить доступ к свойству этого недопустимого объекта Objective C приведет к EXC_BAD_ACCESS. Кроме того, вы уверены, что EXC_BAD_ACCESS не происходит в пределах +sharedManager?

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