相关疑难解决方法(0)

在32位和64位体系结构上格式化NS(U)Integer时输入类型的替代方法?

随着iOS版的64位版本,我们不能使用%d%u再格式化NSIntegerNSUInteger.因为对于64位,这些是typedef'd longunsigned long不是intunsigned int.

因此,如果您尝试使用%d格式化NSInteger,Xcode将发出警告.Xcode对我们很好,并提供了这两种情况的替代品,它包括一个带有l前缀的格式说明符和一个长的类型转换.然后我们的代码基本上是这样的:

NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);
Run Code Online (Sandbox Code Playgroud)

如果你问我,这是一个痛苦的眼睛.

几天前,Twitter上有人提到格式说明符%zd来格式化签名变量和%tu在32位和64位平台上格式化无符号变量.

NSLog(@"%zd", i);
NSLog(@"%tu", u);
Run Code Online (Sandbox Code Playgroud)

这似乎有效.而且我更喜欢类型转换.

但老实说,我不知道为什么这些工作.现在两者对我来说基本上都是神奇的价值观.

我做了一些研究,并发现z前缀意味着以下格式说明符具有相同的大小size_t.但我完全不知道前缀是什么t意味着.所以我有两个问题:

究竟是什么%zd%tu意味着什么呢?

是否可以安全使用%zd,%tu而不是苹果建议长期使用?


我知道类似的问题和Apples 64位过渡指南,它们都推荐这种%lu (unsigned long)方法.我要求替代铸造.

printf objective-c nsinteger ios

53
推荐指数
2
解决办法
7894
查看次数

如果我们设置标头“Content-Length”,NSHTTPURLResponse 的 initWithURL 方法会崩溃

这是一些代码,我们在其中设置了一个NSHTTPURLResponse对象:

NSString * data = @"response successful";
NSUInteger length = [data length];
NSDictionary * headersDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:length], @"Content-Length", nil];

NSHTTPURLResponse * response = [[NSHTTPURLResponse alloc] initWithURL:[request URL] statusCode:200 HTTPVersion:@"1.1" headerFields:headersDict];
Run Code Online (Sandbox Code Playgroud)

headersDict如果我们将其作为参数,以下代码将在最后一行崩溃。

错误:testReportAppOpenToAdMobWithAppstoreId (AdTrackerTests) 失败:-[__NSCFNumber length]:无法识别的选择器发送到实例 0xf653f40

我不知道为什么会崩溃。调试显示headersDict没问题,我怀疑是苹果的bug。

有任何想法吗?

crash header objective-c ios nshttpurlresponse

2
推荐指数
1
解决办法
1668
查看次数

标签 统计

ios ×2

objective-c ×2

crash ×1

header ×1

nshttpurlresponse ×1

nsinteger ×1

printf ×1