Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 对象alloc init不规则性_Objective C_Cocoa - Fatal编程技术网

Objective c 对象alloc init不规则性

Objective c 对象alloc init不规则性,objective-c,cocoa,Objective C,Cocoa,我在试图编写的一个应用程序中看到了一些令人不安的关于对象分配和初始化的异常情况 我有一个“根”Modelcontroller对象,它又包含对子客户的引用。根控制器称为modelController,在其init方法中,它分配和初始化子客户机,如下所示: - (id)init { NSLog(@"%@", @"ModelController begin init"); self = [super init]; if (self) { LibraryController * tempLib

我在试图编写的一个应用程序中看到了一些令人不安的关于对象分配和初始化的异常情况

我有一个“根”Modelcontroller对象,它又包含对子客户的引用。根控制器称为modelController,在其init方法中,它分配和初始化子客户机,如下所示:

- (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”日志消息,但不会看到“complete init”。有时我看不到初始化日志消息。在上述任何情况下,应用程序都会启动

这似乎是随机发生的,五分之一的发射或二十分之一的发射。当这种情况发生时,应用程序表现得非常奇怪(但不是每次都如此,请注意),无缘无故地在海滩上打滚,表现出普遍的古怪

作为旁注,我曾经在StoreController类的init方法中放置了一个断点,当暂停执行时,它会在调试控制台中弹出一块随机数据:

$M2303350336033703338033903#00$M230335033603,3a03#00$88EE4109010000091E42090100000000E42009010000060EE410901000000B062F668FF7F000070044391F7F0000F000E08000000000300008200100DC62F668FF7F00000D862F668FF7F00000000000000000000000717DDD8AFF7F00000000000682001008010400000007000070000FF7000700007000070000700007000070000707000070000700007000070000700000007000070000FF63F668FF000038000000FF7FF3280000007863F668FF7F000001EE410901000000F062F668FF7F00006C5BD391FF7F0000000000FF7F0000AB064391FF7F0000000000FF03280000000000040 ……等等

我应该从哪里着手解决这个问题

modelController是从MyDocument等效类中alloc init指定的,并作为单例进行建模

单例实现如下所示:

static ModelController *sharedModelController = nil;

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

最后一点注意:我已尝试删除locationManager内容,并在方案中禁用/启用“还原状态”首选项,但没有效果。

听起来你在做一些不在主线程上的UI内容。 这通常会导致奇怪的行为。
确保调用主线程上与UI相关的所有内容

最佳猜测:
ModelController
对象正在释放。也许单例是有缺陷的。

问题:您使用的是ARC吗?如何定义
存储
位置管理器
属性。另外,
NSLog
被定义为需要格式语句,而不是
NSString
,因此正确的语句应该是:
NSLog(@“%@”,“@“ModelController:completed init”)。回答OP中的问题会很有帮助。我只是想指出,@“ModelController:completed init”是一个有效的格式语句,他的NSLog()调用的编写方式没有问题。@CocoaFu我更新了帖子以回答您的问题。@Andrew是的,这种用法有问题。另外,其他
NSLog
语句的代码未知。当事情对我不起作用时,我会首先修复所有有问题的代码。:-)控制台中有一堆奇怪的输出,这一事实确实指向一个错误的
NSLog
语句。@CocoaFu其他NSLog语句与此处的语句相同,只是它们说的是“LibraryController complete init”,而不是“ModelController”。即使在我将NSLog格式字符串更改为您推荐的格式后,我仍然会遇到缺少日志语句的问题。然而,我仍然无法在更改之前或之后重现垃圾输出。