有没有办法找出iOS中可用的内存量?我知道当可用内存不足时,系统会传递低内存警告.但是,我的应用程序有一些点,单个线程将执行复杂的任务,有时该任务耗尽足够的内存,它只是由操作系统终止(我的应用程序可以从互联网上下载图片,我将它们缩小到一个小大小...如果用户下载一个非常大的图像,我的应用程序内存不足,只是'poof').
让应用程序自发终止显然是一种糟糕的用户体验.
当我即将耗尽内存并停止任务时,有什么方法可以找到?
我想我可以将任务放在一个单独的线程上,也许系统会向主线程发送一个低内存警告,但这似乎很复杂,甚至不能保证工作.
谢谢!罗恩
我有一个UIWebView,我想加载一个SVG图像.该文件的内容是纯SVG即<svg>...</svg>.该文件可以正常加载到普通和Safari,也可以使用loadRequest加载到UIWebView中:执行以下操作:
url = [NSURL fileURLWithPath:path];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
[webView loadRequest:req];
Run Code Online (Sandbox Code Playgroud)
但是,如果我将文件的内容加载到字符串中,并尝试将HTML字符串加载到webview中,则不会显示任何内容:
html = [NSString stringWithContentsOfFile:path
encoding:NSASCIIStringEncoding
error:nil];
[webView loadHTMLString:html baseURL:nil];
Run Code Online (Sandbox Code Playgroud)
上述两种技术之间有什么理由吗?他们不应该给出相同的结果吗?该文件是纯ASCII,所以我认为没有编码问题.
我想我现在可以通过使用文件获得我需要完成的工作,但我讨厌将文件系统用于非持久性数据.
任何帮助是极大的赞赏!!!
谢谢,罗恩
我正在开发一个应用程序,允许用户在多个设备上编辑同一个数据库.编辑将包括添加/删除/修改对象,因此为了使同步工作更容易,我想为对象分配唯一的ID,并且我希望减少这些ID与在其他设备上独立生成的ID冲突的可能性.
我的一个想法是使用当前时间生成唯一ID.我目前正在考虑创建这样的ID:
unsigned long long idNumber = ([NSDate timeIntervalSinceReferenceDate] * 1000000);
这将创建一个64位整数,这是自参考日期以来的微秒数.我相信这个数字需要50万年左右来包装,所以我不认为我需要担心任何Y2K类型的问题.
我可以将NSTimeInterval存储为ID,但是我对比较双倍的平等感到不舒服,即使它可能会起作用.除此之外,我可以将64位整数转换为字符串并从字符串转换而不会丢失任何精度,我不认为我可以对双打说同样的话.
这对我来说有点像"黑客",虽然我看不出有什么理由不起作用.它似乎也可以移植到支持"unsigned long long"的任何设备上.我唯一的问题是我需要使用8个字节来存储ID,虽然我不希望系统中的ID数量那么大,所以我不认为ID中的内存/磁盘使用量应该是是个大问题.
任何想法/警告/建议将不胜感激.
谢谢,罗恩
我正在使用包含UTF32字符的十六进制代码的数据库.我想把这些字符存储在NSString中.我需要有两种方式转换的例程.
要将NSString的第一个字符转换为unicode值,此例程似乎有效:
const unsigned char *cs = (const unsigned char *)
[s cStringUsingEncoding:NSUTF32StringEncoding];
uint32_t code = 0;
for ( int i = 3 ; i >= 0 ; i-- ) {
code <<= 8;
code += cs[i];
}
return code;
Run Code Online (Sandbox Code Playgroud)
但是,我无法做反向(即采用单个代码并将其转换为NSString).我想我可以通过简单地创建一个带有UTF32字符的c字符串,并按照正确的顺序使用字节,然后使用正确的编码从中创建一个NSString.
但是,转换到cstrings /从cstrings转换对我来说似乎并不可逆.
例如,我尝试过这段代码,"tmp"字符串不等于原始字符串"s".
char *cs = [s cStringUsingEncoding:NSUTF32StringEncoding];
NSString *tmp = [NSString stringWithCString:cs encoding:NSUTF32StringEncoding];
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么?我应该使用"wchar_t"作为cstring而不是char*吗?
任何帮助是极大的赞赏!
谢谢,罗恩
我想在我正在处理的iPhone应用程序中添加简单的密码保护.我可能会使用crypt()将密码以CoreData/sqlite格式存储在我的数据库中.
我想我对如何创建和存储密码非常了解,但是如果用户忘记了密码,我想添加密码恢复能力
这是我在iOS中苦苦挣扎的部分.我希望一切都是本地的,所以我想不出使用链接重置密码的方法.
我曾考虑过通过电子邮件发送密码,但在iOS中,如果没有持有设备的人看到电子邮件的内容,就无法发送电子邮件.
我能想到的唯一方法是拥有一个或两个"备份密码",这基本上是用户选择问题的答案(或者甚至只是存储提醒问题和密码).
这些都不是那么安全,虽然我的应用程序中受保护的数据并不那么重要,所以我不是在寻找最强大的解决方案(只是一个不太难实现的体面解决方案,对于用户,并没有太大的黑客打破).
建议非常感谢.
谢谢,罗恩
我想在不加载任何实际数据的情况下测试 URL 是否存在。
我正在考虑启动 NSURLConnection,然后使用这两个委托方法来检查状态:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// Connection failed ... presumably this is a server issue, and I don't know if the URL exists or not.
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
int status = [((NSHTTPURLResponse *)response) statusCode];
[connection cancel];
// Do something with the status
}
Run Code Online (Sandbox Code Playgroud)
这是一个明智的方式吗?我正在测试的文件可能非常大,因此我想确保不会下载实际文件。
谢谢,罗恩
ps 我正在考虑添加这个,因为苹果强制我的应用程序停止备份从互联网下载的文件。相反,我将文件存储在非备份空间中,并在备份数据库中跟踪文件的原始位置。由于该文件旨在成为用户库的永久部分,因此我想定期测试文件是否不可访问,然后将其移至备份空间(例如,这样它将在恢复到新设备时幸存下来) 。我对苹果公司强迫我做出这样的改变感到非常恼火,因为我可以想象客户会丢失重要数据。
pps 由于某些奇怪的原因,这些委托方法不再出现在 NSURLConnectionDelegate 协议的文档中。我假设文档只是搞砸了。
我只是冒险尝试在CoreData上重写我的应用程序(之前我使用的是自己的内部保存格式).
事情大多都在起作用,虽然我对deleteObject的行为有点困惑:
我有一个对象是我的图形的一部分,当我删除它时,对象似乎没有发生任何事情.该对象具有关系,其中一些是"级联",一些是"Nullify".与对象之间的每个关系都具有反比关系.
删除对象后,唯一似乎改变的是在我的对象上设置了"isDeleted"标志.所有关系都像以前一样存在.
如果我尝试使用NSFetchRequest查找对象,则它找不到已删除的对象.但是,如果我使用KVC关系遍历我的图形,则返回的NSSet包含所有对象,包括已删除的对象.
在我将save:方法发送到我的ManagedObjectContext后,一切都如我所料.
当我删除时,是否需要手动删除我不想要的关系,或者我是否需要不断保存以保持数据的正确性?这对我来说似乎非常直观.
有什么我可以做"提交"删除或至少使我的对象图表缺乏保存.每次我想要修改我的图表时,进行保存似乎有点激烈.
谢谢,罗恩
ps以下是一些对我来说很奇怪的行为:
在删除对象之前,这是父对象的"描述",它具有categoryObjs"to many"关系:
categoryObjs = (
"0x613e1a0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p9>",
"0x613e1b0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p12>",
"0x613e190 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p7>"
);
Run Code Online (Sandbox Code Playgroud)
删除"p12"对象(上面的中间对象)后,通过KVC访问时关系的状态不会改变.如果我尝试获取TestCategory实体,则只找到两个实体.
在"保存:"之后,p12对象消失:
categoryObjs = (
"0x613e1a0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p9>",
"0x613e190 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p7>"
);
Run Code Online (Sandbox Code Playgroud)