小编Nuo*_*oji的帖子

线程安全的UIKit方法

我试图在iOS 4.0上确切地找出UIKit中哪些方法(名称!)成为线程安全的.

我搜索过Apple的文档但收效甚微.例如,UIImage使用imageNamed创建的:在其他线程上使用是不安全的(它偶尔会CGImage从主线程中抛弃它),而imageWithCGImage可能是(?).此外,我已经看到UIColor在主线程以外的线程上使用的声明是安全的.

有哪些方法是安全的,哪些方法不安全?

编辑:有趣的是UIKit类在单独的线程上使用很有趣,例如UIImage,UIColor等等.

uikit ios

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

AES256 CBC + HMAC SHA256确保机密*和*身份验证?

我正在考虑使用AES256 CBC + HMAC SHA-256作为消息的构建块,以确保机密性和身份验证.

特别要考虑这种情况:

  • Alice拥有属于Bob的公钥(密钥交换和算法超出了该问题的范围).Alice有一个识别密钥K,也是与Bob共享的,她可以用来识别自己.只有Alice和Bob知道密钥K.
  • Alice使用Bob的公钥加密(nonce || K).
  • 鲍勃解密数据包,现在有K和nonce.
  • Bob使用SHA-256和SHA256(K || nonce)来产生256位的K(e).
  • Bob使用SHA256和SHA256(K || nonce + 1)来产生256位的K(s).

现在,对于Bob希望发送Alice的每个数据包,他执行以下操作:

  • 创建一个新的随机128位IV
  • 使用IV和K(e)作为密钥加密消息.
  • 创建一个SHA-256 HMAC,其中K(s)作为密钥,(IV || Encrypted message)作为数据.
  • 最后发送(IV || HMAC || Ciphertext)给Alice

Alice还计算了K(e)和K(s),并且在从Bob接收数据时遵循以下过程:

  • 将邮件拆分为IV,密文和HMAC.
  • 使用K(s),IV和密文计算HMAC.
  • 将HMAC与发送的HMAC进行比较.如果匹配,则Alice认为此消息被认证为Bob发送的消息,否则将被丢弃.
  • Alice使用K(e)解密消息

该协议是否确保Alice仅解密来自Bob的消息,假设除了Bob之外没有人可以读取Alice使用他的公钥加密的加密消息?

即以这种方式构建的消息是否确保机密性和身份验证?

注意:如果协议要求Bob发送多条消息,则需要稍加修改此方案以避免重放攻击.

PS我知道AES-GCM/CCM,但这种方案适用于大多数加密包中的基本AES,SHA和HMAC算法.此解决方案也可能较慢,但这也超出了问题的范围.

security cryptography aes hmac

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

SpriteKit SKScene缺少touchesEnded

我注意到touchesEnded并不总是通过多点触控传递给SKScene.根据移除手指等的速度,我会永远错过一些touchesEnded.touchesCancelled已实现,我添加了一个自定义UIView并放在屏幕的左侧 - 没有问题.我做了一个自定义的SKView并捕获了事件 - 再次没有问题.

显而易见的是,SKScene没有得到所有的触动,而是嵌入了SKView,但为什么呢?

(顺便说一句,我完全没有任何节点地运行SKScene)

编辑:

一些进一步的调查显示我可以让SKScene完全失去联系:

我将3个手指放在显示器上,然后一次取出一个,直到只有一根手指接触.我移动手指 - >只有SKView收到移动事件,SKScene没有.也没有收到touchesEnded.

经过一些实验,我可以说当一个touchesBegan在一次通话中接到超过1次触摸时就会发生这种情况(例如,你同时按下两根手指).然后这两个接触被纠缠在一起,因此只有其中一个发送事件.

这似乎是SKScene中的一个错误.我正在iPhone 5上进行测试

uiresponder touches ios sprite-kit

9
推荐指数
1
解决办法
1470
查看次数

在 Java Swing 中从原始图像生成 HiDPI ImageIcon

我有一个应用程序,它将使用 JLabel 和图标大小为 32x32 的 ImageIcon。

我现在想使用 64x64 图像,加载它并将其大小调整为 32x32(如果 DPI 较低),否则将其用作高 DPI 图像。

调整大小很容易,这个技巧的例子如下:

ImageIcon icon = ...
Image lowRes = icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
return new ImageIcon(lowRes);
Run Code Online (Sandbox Code Playgroud)

但是,我无法找到将 ImageIcon 设置为高 DPI 图像的方法。

我尝试过使用 MultiResolutionImage 但没有成功。

编辑:尝试以天真的方式使用 MultiResolutionImage:

private ImageIcon loadIcon(String iconName)
{
  ImageIcon icon = new ImageIcon(getClass().getClassLoader()
                       .getResource("res/icons/toolbar/" + iconName));
  BaseMultiResolutionImage baseMultiResolutionImage = new BaseMultiResolutionImage(
    icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH),
    icon.getImage()
  );
  return new ImageIcon(baseMultiResolutionImage);
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

2019-06-11 14:00:45,962 ERROR [AWT-EventQueue-0] Catch.all - Uncaught exception on [AWT-EventQueue-0]: Invalid Image variant
java.lang.IllegalArgumentException: …
Run Code Online (Sandbox Code Playgroud)

java swing hidpi

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

保留IBOutlet视图元素真的是最佳做法吗?

我一直遇到UIViewControllers的情况,其中包含大量的IBOutlets,将控制器连接到其视图的子视图(通常是UILabels).

继"最佳实践",即使用保留的所有UI元素:@property (retain, nonatomic) UILabel *theElement1,@property (retain, nonatomic) UILabel *theElement2,...给我疯了大量的锅炉板代码dealloc,并viewDidUnload在视图控制器.

违规IBOutlets永远不会被使用,也不会在UIViewController之外设置(set-method仅用于viewDidUnload和加载nib时),除非在加载nib时自动执行.

"最佳实践"的结果是:

  • dealloc与散落[theElement1 release],[theElement2 release]等等.
  • viewDidUnload[self setTheElement1:nil],[self setTheElement2:nil]等等.

但是,由于所有这些元素都已被视图保留,并且UIViewController在适当的时候释放了视图,因此我完全没有理由手动管理它.

这种特殊"最佳实践"(据我所知)的原因是与您的保留一致.但是,一旦你开始拥有大量的网点,你就更有可能错过在两种方法中的任何一种方式处理某个插座,而不是你无法正确地改变网点以"保留"你真正想要的那些特殊插座即使在观看结束后再保留.

这个"最佳实践"除了我所知道的之外还有什么理由,或者在UIViewController视图的子视图的特定情况下我是否可以自由地打破这个"规则"?

iphone

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

针对低延迟和小数据包的建议 TCP 套接字设置

我想知道除了禁用 Nagle 之外,我是否可以对 TCP 套接字进行一些调整,以便为主要包含小数据包的客户端-服务器协议获得尽可能低的延迟。

客户端数据包大多小于 100 字节,服务器数据包大小为 100-300 字节。

我在服务器端使用 java,在客户端使用 (objective-) c。

sockets network-programming tcp

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

将 PNG 图像预修剪为 alpha 并获得偏移量

我有一组大小相同的图像,以 PNG 格式保存。

稍后,在我的程序中,我将使用这些图像并将它们叠加在一起。

然而,这些图像中的每一个的非透明部分实际上都非常小。因此,为了提高性能,最好使用修剪为 alpha 的图像,以便将每个图像裁剪为包含所有非 alpha 像素的最小可能矩形。

当在另一个顶部绘制每个图像时,我只需要绘制带有偏移量的裁剪图像。

很多图像,所以不应该手动完成 - 也不是我想在我的程序第一次启动时做的事情。

换句话说,我希望创建一些可以有效处理此问题的批处理作业。

ImageMagick 具有“修剪”功能,它可以满足我的要求,但我需要捕获偏移量。然后这个偏移量需要以某种方式伴随图像 - 通过将偏移量写入文件,或将其放入文件名中(例如,如果偏移量是 34x99,overlay123.png 可以变成 overlay123-34x99.png)。

工作的最佳工具是什么?我可以编写这样一个例程来手动完成,但似乎应该有一些命令行实用程序我可以使用,或者用某种脚本语言在几行中完成。

image imagemagick image-processing

4
推荐指数
1
解决办法
305
查看次数

使用CoreText绘制时未显示NSTextAttachment图像

出于某种原因,当使用核心文本时,我无法获得要绘制的NSTextAttachment图像,尽管当NSAttributedString添加到UILabel时,相同的图像会显示正常.

在iOS上,此渲染将为NSTextAttachments提供空白空间,对于OS X,将为每个NSTextAttachment呈现占位符[OBJECT]方形图像.为了使用CoreText渲染图像,还需要做些什么吗?

渲染代码:

CGFloat contextHeight = CGBitmapContextGetHeight(context);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)_attributedString);
CGPathRef path = CGPathCreateWithRect(CGRectMake(rect.origin.x,
                                                 contextHeight - rect.origin.y - rect.size.height,
                                                 rect.size.width,
                                                 rect.size.height), NULL);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
CFRelease(framesetter);
CGPathRelease(path);
CGContextSaveGState(context);
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0.0f, contextHeight);
CGContextScaleCTM(context, 1.0f, -1.0f);
CTFrameDraw(frame, context);
CGContextRestoreGState(context);
CFRelease(frame);
Run Code Online (Sandbox Code Playgroud)

macos core-text ios

4
推荐指数
1
解决办法
798
查看次数

使用NIO DatagramChannel我需要处理部分读/写数据包吗?

使用SocketChannel时,需要保留读写缓冲区来处理部分写入和读取.

我怀疑在使用DatagramChannel时可能不需要它,但信息很少.

这是什么故事?

我应该反复调用(非阻塞)接收(ByteBuffer),直到我得到一个空值来读取所有等待的数据报吗?

当以非阻塞模式发送时,我可以依靠send(ByteBuffer,SocketAddress)发送整个缓冲区或完全拒绝它,还是我需要保留部分写入的缓冲区?

java sockets datagram

3
推荐指数
1
解决办法
2146
查看次数

在C++中,我可以使用来自不同文件的值安全地初始化unordered_map吗?

想象一下这样的代码:

std::unordered_map<std::string, std::function<Foo *()>> FooFactory;
void registerFoo(std::string name, std::function<Foo *()> factory)
{
    FooFactory.emplace(name, factory);
}
Run Code Online (Sandbox Code Playgroud)

如果我现在会在另一个文件中写这样的代码:

static bool Baz = [](){ registerFoo("baz", []() { return new BazFoo(); })}();
Run Code Online (Sandbox Code Playgroud)

而另一个:

static bool Bar = [](){ registerFoo("bar", []() { return new BarFoo(); })}();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当程序初始化时调用registerFoo,但是FooFactory随后被清零,因此注册的函数消失.

有没有办法让这个工作以安全的,独立于编译器的方式工作(对于c ++ 14)?

c++ initialization static-order-fiasco c++14

3
推荐指数
1
解决办法
223
查看次数