我想只有在当前设备的iOS版本低于特定版本运行一段代码,作为指定在这里.Apple给出的代码示例如下所示:
if (@available(iOS 10.0, *)) {
  // iOS 10.0 and above
} else {
  // below 10.0
}
但是,有些情况下,只有当前iOS版本低于特定版本时,才会运行代码.我假设以下代码将起作用:
if (!@available(iOS 10.0, *)) {
  // below 10.0
}
但似乎这不起作用,我从Xcode收到以下警告:
@available does not guard availability here; use if (@available) instead
这是添加了我所看到的诊断的LLVM提交.
该问题有两种可能的后备:
if-else变体而不向if块添加任何代码(不是很优雅).-[NSProcessInfo isOperatingSystemAtLeastVersion:].还有另一种使用@available我想要的方法吗?
直到几天前,以下URL处理程序重定向用户赠送应用程序:
  static NSString * const kAppStoreGiftURL = @"itms-appss://buy.itunes.apple.com/"
  "WebObjects/MZFinance.woa/wa/giftSongsWizard"
  "?gift=1&salableAdamId=%u&productType=C&pricingParameter=STDQ&mt=8&ign-mscache=1";
  NSString *url = [NSString stringWithFormat:kAppStoreGiftURL, kAppID];
  NSLog(@"Opening store with URL: %@", url);
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
但是,似乎现在这会产生以下错误消息openURL:

仍可通过商店直接赠送应用程序.
Apple是否完全禁用了此功能,或者是否有新的URL可以缓解此问题?
我正在使用OpenCV和cv::Mat对象,我需要知道我的矩阵占用的字节数,以便将它传递给低级C API.似乎OpenCV的API没有返回矩阵使用的字节数的方法,并且我只有一个原始uchar *data公共成员,没有包含其实际大小的成员.
如何找到cv::Mat以字节为单位的大小?
我正在尝试使用ImageIO以HEIC文件格式保存图像.代码看起来像这样:
NSMutableData *imageData = [NSMutableData data];
CGImageDestinationRef destination = CGImageDestinationCreateWithData(
    (__bridge CFMutableDataRef)imageData,
    (__bridge CFStringRef)AVFileTypeHEIC, 1, NULL);
if (!destination) {
  NSLog(@"Image destination is nil");
  return;
}
// image is a CGImageRef to compress.
CGImageDestinationAddImage(destination, image, NULL);
BOOL success = CGImageDestinationFinalize(destination);
if (!success) {
  NSLog(@"Failed writing the image");
  return;
}
这适用于具有A10的设备,但在旧设备和模拟器(也是根据Apple)上失败,因为未能初始化destination和错误消息findWriterForType:140: unsupported file format 'public.heic'.我找不到任何直接的方法来测试硬件是否支持HEIC而不初始化新的图像目的地并测试可空性.
有基于AVFoundation的API用于检查是否可以使用HEIC保存照片,例如使用-[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:],但我不想为此初始化和配置捕获会话.
有没有更直接的方法来查看硬件是否支持这种编码类型?
从C ++ 11开始,static已知本地变量将以线程安全的方式初始化(除非-fno-threadsafe-statics给出),如本问题所述。这是否意味着以下众所周知的模式:
+ (NSObject *)onlyOnce {
  static NSObject *object;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    object = [[NSObject alloc] init];
  });
  return object;
}
可以替换为更短的:
+ (NSObject *)onlyOnce {
  static NSObject *object = [[NSObject alloc] init];
  return object;
}
使用C ++ 11和更高版本的C ++语言方言将代码编译为Objective-C ++时?
我正在运行以下代码:
for (int i = 0; i < 100; ++i) {
  NSDate *date = [NSDate date];
  NSTimeInterval interval = date.timeIntervalSince1970;
  NSDate *newDate = [NSDate dateWithTimeIntervalSince1970:interval];
  if (![date isEqualToDate:newDate]) {
    NSLog(@"Not equal!");
  }
}
令人惊讶的是,在许多迭代中,日期彼此并不相等。怎么可能?