我试图在iOS 4.0上确切地找出UIKit中哪些方法(名称!)成为线程安全的.
我搜索过Apple的文档但收效甚微.例如,UIImage
使用imageNamed创建的:在其他线程上使用是不安全的(它偶尔会CGImage
从主线程中抛弃它),而imageWithCGImage
可能是(?).此外,我已经看到UIColor
在主线程以外的线程上使用的声明是安全的.
有哪些方法是安全的,哪些方法不安全?
编辑:有趣的是UIKit类在单独的线程上使用很有趣,例如UIImage
,UIColor
等等.
我正在考虑使用AES256 CBC + HMAC SHA-256作为消息的构建块,以确保机密性和身份验证.
特别要考虑这种情况:
现在,对于Bob希望发送Alice的每个数据包,他执行以下操作:
Alice还计算了K(e)和K(s),并且在从Bob接收数据时遵循以下过程:
该协议是否确保Alice仅解密来自Bob的消息,假设除了Bob之外没有人可以读取Alice使用他的公钥加密的加密消息?
即以这种方式构建的消息是否确保机密性和身份验证?
注意:如果协议要求Bob发送多条消息,则需要稍加修改此方案以避免重放攻击.
PS我知道AES-GCM/CCM,但这种方案适用于大多数加密包中的基本AES,SHA和HMAC算法.此解决方案也可能较慢,但这也超出了问题的范围.
我注意到touchesEnded并不总是通过多点触控传递给SKScene.根据移除手指等的速度,我会永远错过一些touchesEnded.touchesCancelled已实现,我添加了一个自定义UIView并放在屏幕的左侧 - 没有问题.我做了一个自定义的SKView并捕获了事件 - 再次没有问题.
显而易见的是,SKScene没有得到所有的触动,而是嵌入了SKView,但为什么呢?
(顺便说一句,我完全没有任何节点地运行SKScene)
编辑:
一些进一步的调查显示我可以让SKScene完全失去联系:
我将3个手指放在显示器上,然后一次取出一个,直到只有一根手指接触.我移动手指 - >只有SKView收到移动事件,SKScene没有.也没有收到touchesEnded.
经过一些实验,我可以说当一个touchesBegan在一次通话中接到超过1次触摸时就会发生这种情况(例如,你同时按下两根手指).然后这两个接触被纠缠在一起,因此只有其中一个发送事件.
这似乎是SKScene中的一个错误.我正在iPhone 5上进行测试
我有一个应用程序,它将使用 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) 我一直遇到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视图的子视图的特定情况下我是否可以自由地打破这个"规则"?
我想知道除了禁用 Nagle 之外,我是否可以对 TCP 套接字进行一些调整,以便为主要包含小数据包的客户端-服务器协议获得尽可能低的延迟。
客户端数据包大多小于 100 字节,服务器数据包大小为 100-300 字节。
我在服务器端使用 java,在客户端使用 (objective-) c。
我有一组大小相同的图像,以 PNG 格式保存。
稍后,在我的程序中,我将使用这些图像并将它们叠加在一起。
然而,这些图像中的每一个的非透明部分实际上都非常小。因此,为了提高性能,最好使用修剪为 alpha 的图像,以便将每个图像裁剪为包含所有非 alpha 像素的最小可能矩形。
当在另一个顶部绘制每个图像时,我只需要绘制带有偏移量的裁剪图像。
有很多图像,所以不应该手动完成 - 也不是我想在我的程序第一次启动时做的事情。
换句话说,我希望创建一些可以有效处理此问题的批处理作业。
ImageMagick 具有“修剪”功能,它可以满足我的要求,但我需要捕获偏移量。然后这个偏移量需要以某种方式伴随图像 - 通过将偏移量写入文件,或将其放入文件名中(例如,如果偏移量是 34x99,overlay123.png 可以变成 overlay123-34x99.png)。
工作的最佳工具是什么?我可以编写这样一个例程来手动完成,但似乎应该有一些命令行实用程序我可以使用,或者用某种脚本语言在几行中完成。
出于某种原因,当使用核心文本时,我无法获得要绘制的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) 使用SocketChannel时,需要保留读写缓冲区来处理部分写入和读取.
我怀疑在使用DatagramChannel时可能不需要它,但信息很少.
这是什么故事?
我应该反复调用(非阻塞)接收(ByteBuffer),直到我得到一个空值来读取所有等待的数据报吗?
当以非阻塞模式发送时,我可以依靠send(ByteBuffer,SocketAddress)发送整个缓冲区或完全拒绝它,还是我需要保留部分写入的缓冲区?
想象一下这样的代码:
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)?