2012-02-01 24 views
0

我正在看我在尝试编写的应用程序中有关对象分配和初始化的一些令人不安的违规行为。对象分配初始化不规则性

我有一个'根'模型控制器对象,它依次包含对子控制器的引用。根控制器称为modelController,在它的初始化方法中,它分配并像这样分配子控制器:

- (id)init 
{ 
NSLog(@"%@", @"ModelController begin init"); 
self = [super init]; 
if (self) { 

    LibraryController * tempLibrary = [[LibraryController alloc] init]; 
    self.library = tempLibrary; 

    StoresController * tempStores = [[StoresController alloc] init]; 
    self.stores = tempStores; 

    CLLocationManager * tempLocationManager = [[CLLocationManager alloc] init]; 
    self.locationManager = tempLocationManager; 

} 

NSLog(@"%@", @"ModelController complete init"); 

return self; 
} 

漂亮的标准。子控制器的init代码在开始和结束时也包含NSLog消息,因为我能够看到一切都很好。

的属性定义为

@property (strong) LibraryController * library; 
@property (strong) StoresController * stores; 
@property (strong) CLLocationManager * locationManager; 

,我使用ARC。

让我感到困惑的是,有时我会看到来自其中一个子控制器的NSLog,而不是来自根控制器。有时我会看到根控制器的'begin init'日志消息,但不是'完整的init'。有时我看不到任何init日志消息。无论如何,这些应用程序都会启动应用程序。

这种情况看似随机发生在五次发射中的一次或二十次发射中的一次。当它发生时,该应用程序的行为非常奇怪(但不是每次都介意你),没有明显的理由和展示普遍的好奇心。

作为一个侧面说明,在同一时间,我把一个断点在StoreController类,它暂停时的​​初始化方法在执行吐出调试控制台中的随机数据块:

$ m2303, 3503,3603,3703,3803,3903#$ 00 m2303,3503,3603,3a03#$ 00 88ee410901000000981e420901000000001e42090100000060ee410901000000b062f668ff7f000070044391ff7f0000f00e0800000000000300000068200100dc62f668ff7f0000d862f668ff7f00000000000000000000717ddd8aff7f00000000000068200100801e420901000000000000000600000706000007000000007063f668ff7f000003280000000000007863f668ff7f000001ee410901000000f062f668ff7f00006c5bd391ff7f000000000000ff7f0000ab064391ff7f000000000000ffffffff032800000000000040 ...和等

我该从哪里开始寻找解决这个问题?

modelController是从MyDocument等价类中alloc init'd,并被建模为一个单例。

的单身实现看起来是这样的:

static ModelController *sharedModelController = nil; 

+ (ModelController*)sharedManager 
{ 
    if (sharedModelController == nil) { 
     sharedModelController = [self new]; 
    } 
    return sharedModelController; 
} 

最后说明一点:我已经试图消除的LocationManager的东西和禁用/启用该计划的“恢复状态”的偏好,但无济于事。

+1

问题:您使用ARC吗?如何定义'library','stores'和'locationManager'属性。另外,'NSLog'被定义为需要格式语句,而不是'NSString',所以正确的语句是:NSLog(@“%@”,@“ModelController:completed init”);'。 – zaph 2012-02-01 20:55:18

+0

您从OP的问题的答案将是有帮助的。我只想指出@“ModelController:completed init”是一个有效的格式语句,并且他的NSLog()调用写入的方式没有任何问题。 – 2012-02-01 21:06:14

+0

@CocoaFu我更新了帖子来回答你的问题。 – Frost 2012-02-01 21:09:49

回答

1

听起来像你正在做的一些UI的东西不在主线程。 这通常会导致怪异的行为。 请确保您调用主线程上的所有UI相关

0

最佳猜想:ModelController对象正在发布。也许单身人士是错误的。