小编Sta*_*ort的帖子

否定Objective-C的@available关键字

我想只有在当前设备的iOS版本低于特定版本运行一段代码,作为指定在这里.Apple给出的代码示例如下所示:

if (@available(iOS 10.0, *)) {
  // iOS 10.0 and above
} else {
  // below 10.0
}
Run Code Online (Sandbox Code Playgroud)

但是,有些情况下,只有当前iOS版本低于特定版本时,才会运行代码.我假设以下代码将起作用:

if (!@available(iOS 10.0, *)) {
  // below 10.0
}
Run Code Online (Sandbox Code Playgroud)

但似乎这不起作用,我从Xcode收到以下警告:

@available does not guard availability here; use if (@available) instead
Run Code Online (Sandbox Code Playgroud)

是添加了我所看到的诊断的LLVM提交.

该问题有两种可能的后备:

  1. 使用if-else变体而不向if块添加任何代码(不是很优雅).
  2. 继续使用旧的方法,如-[NSProcessInfo isOperatingSystemAtLeastVersion:].

还有另一种使用@available我想要的方法吗?

objective-c ios availability ios11 xcode9

15
推荐指数
1
解决办法
4692
查看次数

发送用户从应用程序内部赠送应用程序不再起作用了吗?

直到几天前,以下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]];
Run Code Online (Sandbox Code Playgroud)

但是,似乎现在这会产生以下错误消息openURL:

重定向后的App Store应用程序

仍可通过商店直接赠送应用程序.

Apple是否完全禁用了此功能,或者是否有新的URL可以缓解此问题?

app-store openurl ios

13
推荐指数
1
解决办法
1194
查看次数

查找cv :: Mat的字节大小

我正在使用OpenCV和cv::Mat对象,我需要知道我的矩阵占用的字节数,以便将它传递给低级C API.似乎OpenCV的API没有返回矩阵使用的字节数的方法,并且我只有一个原始uchar *data公共成员,没有包含其实际大小的成员.

如何找到cv::Mat以字节为单位的大小?

opencv

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

验证我的设备是否能够以HEIC格式编码图像的正式方法是什么?

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

这适用于具有A10的设备,但在旧设备和模拟器(也是根据Apple)上失败,因为未能初始化destination和错误消息findWriterForType:140: unsupported file format 'public.heic'.我找不到任何直接的方法来测试硬件是否支持HEIC而不初始化新的图像目的地并测试可空性.

有基于AVFoundation的API用于检查是否可以使用HEIC保存照片,例如使用-[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:],但我不想为此初始化和配置捕获会话.

有没有更直接的方法来查看硬件是否支持这种编码类型?

ios hevc heif

6
推荐指数
2
解决办法
880
查看次数

是否可以在Objective-C ++中删除dispatch_once?

从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;
}
Run Code Online (Sandbox Code Playgroud)

可以替换为更短的:

+ (NSObject *)onlyOnce {
  static NSObject *object = [[NSObject alloc] init];
  return object;
}
Run Code Online (Sandbox Code Playgroud)

使用C ++ 11和更高版本的C ++语言方言将代码编译为Objective-C ++时?

c++ objective-c thread-safety objective-c++ c++11

5
推荐指数
1
解决办法
414
查看次数

为什么NSDate的dateWithTimeIntervalSince1970修改其输入?

我正在运行以下代码:

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!");
  }
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,在许多迭代中,日期彼此并不相等。怎么可能?

objective-c nsdate ios

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