iOS应用程序可以在运行时发现,检查或以其他方式读取自己的权利吗?
理想情况下,我可以将我的.entitlements文件的整个(已处理)内容作为plist读取.获得应用程序标识符前缀将是可接受的第二好的.
这里的目标包括:允许应用程序使用各种应用程序标识符前缀进行签名,而无需在代码中进行匹配更改; 并且在共享钥匙串访问组存在或不存在的情况下采取不同的行动.这是库代码,因此我对客户端应用程序配置的影响越小越好.
在一般情况下,使用NSDateFormatter解析rfc3339日期似乎是不可能的.我错了吗?[编辑2年后:现在有办法!见下文和脚注.]
一个不特别具有可塑性的网络服务正在为我提供如下日期:
2009-12-31T00:00:00-06:00
Run Code Online (Sandbox Code Playgroud)
符合Rfc3339,是他们正在使用的jaxb库的默认输出.注意冒号,当偏移量不是文字"z"时,rfc3339 需要冒号:
Run Code Online (Sandbox Code Playgroud)time-numoffset = ("+" / "-") time-hour ":" time-minute time-offset = "Z" / time-numoffset
我想将这些解析为NSDates.
NSDateFormatter需要Unicode指定的语法模式,它为时区提供日期字段符号,如"PDT"," - 0800","GMT-08:00"但不是"-08:00".
谷歌搜索和其他类似的SO问题只产生日期格式
[myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"];
/* or: */ [myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
Run Code Online (Sandbox Code Playgroud)
后者需要字面上的"Z",前者坚持要么没有结肠,要么存在"GMT".但是,它们似乎在ios 4.x之前工作(可能完全丢弃tz偏移量;我的数据不清楚.)
我在这一点上的选择很遗憾:
strptime_l
:工作.:)我是否准确理解了这种情况,当前的NSDateFormatter严格遵循unicode而没有扩展; 并且unicode格式不足以完全描述rfc3339的日期?
[脚注]三年后我回到这个小小的附录:Unicode和Apple已经将这个功能添加到格式字符串中,从iOS6/OSX10.8开始.比较撰写本文时的最新版本与其前一版本,并注意添加5"Z",产生类似"-08:00"的区域格式.因此,如果您能够放弃对5.x/10.7的弃用支持,那么有一种新的正确方法可以做到这一点.我将离开之前的答案,因为它仍然是需要向后兼容性的最佳方法.
问题:在java对象之间保持双向多对一关系.
像Google/Commons Collections bidi地图之类的东西,但我希望在前端允许重复值,并将前向键的集合作为反面值.使用这样的东西:
// maintaining disjoint areas on a gameboard. Location is a space on the
// gameboard; Regions refer to disjoint collections of Locations.
MagicalManyToOneMap<Location, Region> forward = // the game universe
Map<Region, <Set<Location>>> inverse = forward.getInverse(); // live, not a copy
Location parkplace = Game.chooseSomeLocation(...);
Region mine = forward.get(parkplace); // assume !null; should be O(log n)
Region other = Game.getSomeOtherRegion(...);
// moving a Location from one Region to another:
forward.put(parkplace, other);
// or …
Run Code Online (Sandbox Code Playgroud) 这是一些奇怪的行为,我希望有人可以确认是一个已知的bug,或建议一个解决方法.
我的iPad应用程序需要显示一些大型PDF(约7mb和图形密集).阻力最小的路径当然是UIWebView,但我的应用程序在显示几个后崩溃.我在新项目中隔离了行为,并在其上运行了Instruments.
结果如下.它们似乎表明UIWebView中发生了严重泄漏.
基本代码,在最小视图控制器中:
-(IBAction)doPresent:(UIView *)sender
{
NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%d", [sender tag]]
withExtension:@"pdf"];
UIWebView *wv = [[[UIWebView alloc] init] autorelease];
UIViewController *vc = [[[UIViewController alloc] init] autorelease];
[vc setView:wv];
UINavigationController *holder = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];
[self presentModalViewController:holder animated:YES];
[wv loadRequest:[NSURLRequest requestWithURL:url]];
UIBarButtonItem *close = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(doDismiss:)] autorelease];
[[vc navigationItem] setRightBarButtonItem:close];
}
-(IBAction)doDismiss:(id)sender
{
[self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
没有图示:主要的笔尖包含这个VC,它的视图和连接的五个按钮doPresent:
,每个标记有1 ... 5; 应用程序包中的1.pdf到5.pdf.运行它并且它可以像您期望的那样工作,除了它在PDF的六个左右视图之后崩溃.
在仪器(分配)下运行它产生了这个有趣的情节:
我注意到的模式是,如果我显示PDF并在不滚动文档的情况下将其关闭,它会按预期释放,泄漏最少.但是,如果我触摸它并滚动,即使是一点点,内存也不会被释放.查看后续PDF似乎没有重用任何浪费的内存,但每个都分配了更多自己的内存.在模拟器中运行并触发内存警告也不会获得此内存.
当使用量达到〜25mb时,程序得到了kill -9
'd.这对我来说似乎很低,暗示除了app内存之外还有一些其他资源被泄露.
这是在运行4.3的iPad 1上重新启动. …
我想使用iOS 5的漂亮的行移动调用来动画化表视图以匹配某些模型状态更改,而不是使用旧式的“删除并插入”。
更改可能包括重新排序和就地更新,并且我想同时对它们进行动画处理,因此需要一些行reloadRowsAtIndexPaths
。
但!UITableView
如果更新的单元格由于移动而发生位置偏移,则在存在移动的情况下处理行重新加载时似乎完全是错误的。以等效的方式使用较旧的delete + insert调用,效果很好。
这是一些代码;我为冗长而道歉,但确实可以编译并运行。肉在doMoves:
方法中。下面的说明。
#define THISWORKS
@implementation ScrambledList // extends UITableViewController
{
NSMutableArray *model;
}
- (void)viewDidLoad
{
[super viewDidLoad];
model = [NSMutableArray arrayWithObjects:
@"zero",
@"one",
@"two",
@"three",
@"four",
nil];
[self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:
#ifdef THISWORKS
@"\U0001F603"
#else
@"\U0001F4A9"
#endif
style:UIBarButtonItemStylePlain
target:self
action:@selector(doMoves:)]];
}
-(IBAction)doMoves:(id)sender
{
int fromrow = 4, torow = 0, changedrow = 2; // 2 = its "before" position, just like the docs say.
// some model changes …
Run Code Online (Sandbox Code Playgroud)