EXC_BAD_ACCESS при синтезе «глобального» объекта - PullRequest
1 голос
/ 26 февраля 2012

это дополнительный вопрос к моему последнему здесь: iOS: инициализация объекта при запуске приложения для всех контроллеров для использования .

Я настроил свое приложение следующим образом(игнорируйте префикс БД):

DBFactoryClass     // Built a DataManaging Object for later use in the app
DBDataModel        // Is created by the factory, holds all data & access methods
DBViewControllerA  // Will show some of the data that DBDataModel holds
moreViewControllers that will need access to the same DBDataModel Object

Я пошагово пройдусь по приложению, а затем в конце отправлю сообщение об ошибке, которое получаю при сборке.

AppDelegate.h

#import "DBFactoryClass.h"

AppDelegate.m

- (BOOL)...didFinishLaunching...
{
    DBFactoryClass *FACTORY = [[DBFactoryClass alloc ]init ];
    return YES;
}

DBFactoryClass.h

#import <Foundation/Foundation.h>
#import "DBDataModel.h"

@interface DBFactoryClass : NSObject
@property (strong) DBDataModel *DATAMODEL;
@end

DBFactoryClass.m

#import "DBFactoryClass.h"

@implementation DBFactoryClass
@synthesize DATAMODEL;

-(id)init{
    self = [super init];
    [self setDATAMODEL:[[DBDataModel alloc]init ]];
    return self;
}

@end

ViewControllerA.h

#import <UIKit/UIKit.h>
#import "DBDataModel.h"

@class DBDataModel;
@interface todayViewController : UIViewController
@property (strong)DBDataModel *DATAMODEL;
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@end

ViewControllerA.m

#import "todayViewController.h"

@implementation todayViewController 
@synthesize testLabel;
@synthesize DATAMODEL;

- (void)viewDidLoad
{
    todaySpentLabel.text = [[DATAMODEL test]stringValue];
}
@end

DBDataModel.h

#import <Foundation/Foundation.h>

@interface DBDataModel : NSObject
@property (nonatomic, retain) NSNumber* test;
@end

DBDataModel.m

#import "DBDataModel.h"

@implementation DBDataModel
@synthesize test;
-(id)init{
    test = [[NSNumber alloc]initWithInt:4];
    return self;
}
@end

когда я его создаю, я получаюследующая ошибка: EXC_BAD_ACCESS в этой строке:

@synthesize DATAMODEL;

из DBFactoryClass.m

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Что делает @synthesize, это автоматически генерирует реализации методов доступа для свойства. EXC_BAD_ACCESS там означает, что вы получаете доступ к мусору, когда выполняется один из методов доступа.

Это, вероятно, происходит здесь:

[self setDATAMODEL:[[DBDataModel alloc]init ]]; 

Убедитесь, что реализация init *1009* действительно возвращает легитимный объект.

0 голосов
/ 26 февраля 2012

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

- (BOOL)...didFinishLaunching... {
  DBFactoryClass *FACTORY = [[DBFactoryClass alloc ]init ];
  // If you use ARC this might be released right afterwards
  return YES;
}

Если вы хотите, чтобы фабрика была синглтоном, используйте что-то вроде этого

+ (id)sharedInstance {
  static dispatch_once_t once;
  static MyFoo *instance;
  dispatch_once(&once, ^{
    instance = [[self alloc] init];
  });
  return instance;
}
...