2012-06-14 4 views
1

У меня есть Singleton для управления некоторыми переменными, которые мне нужны в разных местах моего приложения. Это синглтон, называется General:EXC_BAD_ACCESS Код = 2 при использовании Singleton

#import "General.h" 

static General *sharedMyManager = nil; 

@implementation General 

@synthesize user; 
@synthesize lon; 
@synthesize lat; 
@synthesize car; 
@synthesize firstmess; 
@synthesize firstfrom; 
@synthesize numcels; 

#pragma mark Singleton Methods 

+ (id)sharedManager { 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    if (sharedMyManager == nil) { 
     sharedMyManager = [[self alloc] init]; 
    } 
}); 

return sharedMyManager; 
} 

- (id)init { 
if (self = [super init]) { 
    user = [[NSString alloc] initWithString:@"vacio"]; 
    numcels=0; 
} 
return self; 
} 

- (void)dealloc { 
// Should never be called, but just here for clarity really. 
} 

@end 

Я использую его в TableView, которые представляют в экранных сообщениях части моего приложения, которое является чатом. Я имею в виду, каждый раз, когда приложение получает или отправляет сообщение, я добавляю 1 к var "numcels", и это значение, которое возвращает метод numberOfRowsInSection.

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
General *general = [General sharedManager]; 
return *(general.numcels); //It freezes here 
} 

Проблема заключается в том, когда я запустить программу, она замерзает на комментировал линии, говоря EXC_BAD_ACCESS код = 2. Я предполагаю, что проблема может быть с синглтоном, но не знаю, где именно.

Любая помощь? Заранее спасибо.

------- -------- EDIT

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSLog(@"Hemos entrado en cellForRowAtIndexPath"); 
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 
if(!cell){ 
UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"]; 
} 
General *general = [General sharedManager]; 
NSString *text=general.firstmess;//it crashes now here 
NSString *remite=general.firstfrom; 
[[cell textLabel]setText:remite]; 
[[cell detailTextLabel] setText:text]; 

return cell; 
} 

И General.h, по запросу:

#import <Foundation/Foundation.h> 

@interface General : NSObject { 
NSString *user; 
double lat; 
double lon; 
} 

@property (nonatomic, retain) NSString *user; 
@property (assign, nonatomic) double lat; 
@property (assign, nonatomic) double lon; 
@property (assign, nonatomic) Boolean car; 
@property (assign, nonatomic) NSString *firstmess; 
@property (assign, nonatomic) NSString *firstfrom; 
@property (assign, nonatomic) int numcels; 

+ (id)sharedManager; 

@end 
+0

Почему вы делаете * (general.numcels); ..? Я имею в виду, какова идея звезды? –

+0

Если я этого не делаю, он показывает предупреждение «несовместимый указатель на целочисленное преобразование ...» – Fustigador

+0

вы можете показать мне ваш .h ...? –

ответ

0

После решения первой проблемы (благодаря помощи Ankit), она разбилась в строке, которую я прокомментировал ниже EDIT. Я просто изменил

@property (nonatomc, assign) NSString *firstmess; 

в

@property (retain, nonatomic) NSString *firstmess; 

И это не врезаться больше.

Спасибо!

2

Это должно быть так:

return general.numcels;

numcels является целым числом, и вы не можете применить *.

Смежные вопросы