- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在运行后台线程以从 Web 服务获取数据。
要获取创建 URL 所需的设置,我正在使用此方法:
+(Settings *)getSettings
{
Settings *settings = [[Settings alloc] init];
NSString *path = [NSString stringWithFormat:@"Documents/Settings"];
NSString *settingsPath = [NSHomeDirectory() stringByAppendingPathComponent:path];
NSFileManager *fileMgr = [NSFileManager defaultManager];
if ([fileMgr fileExistsAtPath:settingsPath]) {
NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
settings.username = [settingsDictionary objectForKey:@"username"];
settings.module = [settingsDictionary objectForKey:@"module"];
settings.websiteUrl = [settingsDictionary objectForKey:@"websiteUrl"];
}else
{
settings.username = @"";
settings.module = @"";
settings.websiteUrl = @"";
}
NSLog(@"Settings = u:%@ m:%@ w:%@",settings.username,settings.module,settings.websiteUrl);
return settings;
}
这在调试器中工作正常,但是当我在设备上运行它时,我在 NSLog 或任何试图使用数据的类上得到 BAD_EXCESS 警告:
警告:正在尝试使用不在框架中的 block 创建 USE_BLOCK_IN_FRAME 变量。
如果我单步执行代码,该代码在设备上运行良好。
有什么想法吗?
编辑:回溯 -
#0 0x37a97eda in objc_retain ()
#1 0x37aa4be4 in objc_retainAutoreleasedReturnValue ()
#2 0x0000f84a in +[SettingData getSettings] (self=0x175e4, _cmd=0x11af9) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/SettingData.m:49
#3 0x0000fa86 in -[DataManager init] (self=0x3509e0, _cmd=0x30fd9f96) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/DataManager.m:19
#4 0x00003b46 in __35-[MasterViewController viewDidLoad]_block_invoke_0 (.block_descriptor=0x185f40) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/MasterViewController.m:70
#5 0x30b08d54 in _dispatch_call_block_and_release ()
#6 0x30b0b896 in _dispatch_worker_thread2 ()
#7 0x37a0e1ce in _pthread_wqthread ()
#8 0x37a0e0a4 in start_wqthread ()
我尝试将以下内容添加到设置的 init 方法中,如果我不这样做,它会在第二个 NSLog 上崩溃并出现错误:消息已发送到已释放的实例 0x160d60
-(id)init
{
if ((self=[super init]))
{
NSString *path = [NSString stringWithFormat:@"Documents/Settings"];
NSString *settingsPath = [NSHomeDirectory() stringByAppendingPathComponent:path];
NSFileManager *fileMgr = [NSFileManager defaultManager];
if ([fileMgr fileExistsAtPath:settingsPath])
{
NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
self.username = [settingsDictionary objectForKey:@"username"];
self.module = [settingsDictionary objectForKey:@"module"];
self.websiteUrl = [settingsDictionary objectForKey:@"websiteUrl"];
NSLog(@"Settings = u:%@ m:%@ w:%@",self.username,self.module,self.websiteUrl);
}
else
{
self.username = @"";
self.module = @"";
self.websiteUrl = @"";
}
}
NSLog(@"Settings = u:%@ m:%@ w:%@",self.username,self.module,self.websiteUrl);
return self;
}
最佳答案
首先,该方法应该是 retrieveSettings
或 downloadSettings
或者只是 settings
,而不是 getSettings
get
作为前缀对于方法的论证具有非常特殊的含义(通过引用传递)。
其次,该代码
没有明显的错误(除了
。 (我看到 ARC 已启用)。settings
的泄漏,但这不会导致这种崩溃)
最后,如果您遇到崩溃,请发布回溯。您看到的错误消息(“USE_BLOCK_IN_FRAME”)表明您发布的代码与崩溃无关。
奇怪的崩溃,那个。好的——警告来自调试器,与实际错误无关。
范围边界通常是编译器发出 release
和/或排出自动释放池的地方。
引出下一个问题;怎么样
This is the code works fine on the device if I step through the code.
好的——因此,它在全速运行时不起作用,而在逐步运行时起作用。闻起来像并发崩溃。您可以发布实际崩溃的屏幕截图吗? IE。您确定特定的回溯是崩溃的回溯,而不是崩溃时调试器恰好所在的位置吗?
(是的,稍微捕获了救命稻草——根据所显示的证据,这次崩溃没有意义。我喜欢谜题。)
好的——现在我们正在取得进展。有点。在成功记录 内部 if 范围内的相同内容后,它会在 if 范围外部 崩溃。
username
、module
和websiteURL
是如何定义的?它们是 strong
还是更恰本地说,copy
@property
声明?
关于iphone - iOS5 BAD_EXCESS 仅在设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194923/
我正在运行后台线程以从 Web 服务获取数据。 要获取创建 URL 所需的设置,我正在使用此方法: +(Settings *)getSettings { Settings *settings
我正在研究用于测试的 kiwi 框架 myStack.m - (id) init { if (self = [super init]) { _data = [[NSMutabl
我反对,它正在使用委托(delegate) block 。我正在使用 ARC。 @implementation ViewController - (void)createGame { _gam
我是一名优秀的程序员,十分优秀!