我正在屏幕上绘制一个CGContext创建的使用CGBitmapContextCreate,然后CGImage从中生成一个CGBitmapContextCreateImage并将其绘制到我的视图中drawRect(我还在绘制其他一些东西 - 这是一种隔离不同级别的可变性和复杂性的练习).
当它全部在主线程上运行时,一切正常.然而,通过这种方式将其拆分的动机之一就是使得屏幕外部分可以在后台线程上运行(我认为它应该没问题,因为它不会渲染到屏幕上下文).
但是,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的NSLog来验证一切都按正确的顺序发生.
我的下一步是将其归结为最简单的代码,以重现问题(或者找到一些我遗漏的傻事并修复它) - 此时我会在必要时在此处发布一些代码.但我首先要在这里检查一下,我不会走错路.我在googlesphere周围的旅行中找不到任何可以解决问题的东西 - 但是朋友确实提到他在尝试在后台线程中调整图像大小时遇到了类似的问题 - 这表明这里可能存在一些普遍的限制.
[编辑]
感谢到目前为止的回复.如果没有别的,他们告诉我,至少我并不是唯一一个没有答案的人 - 这是我想要找到的一部分.在这一点上,我将把额外的工作放在获得最简单的可能示例上,并且可能会返回一些代码或更多信息.在此期间保持任何想法:-)
提出一点:有几个人在API方面使用了术语线程安全.应该注意的是,在这种情况下有两种类型的线程安全:
我怀疑到目前为止提到的是第一种类型,但如果你能澄清,我将不胜感激.
[edit2 - 解决了!]
好的,我把它全部搞定了.执行摘要是问题出在我身上,而不是位图上下文本身.
在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备.事实证明,间接地调用那些导致在某些视图上调用setNeedsDisplay的其他对象!通过将完成该部分的部分分离到主线程,它现在完全可以正常工作.
所以对于那些遇到这个问题的人来说,想知道他们是否可以在后台线程上绘制位图上下文,答案就是你可以(在这里和答案中提出的警告).
谢谢大家
我们有大量的本机C++代码,编译成DLL.
然后我们有几个包含C++/CLI代理代码的dll来包装C++接口.
最重要的是,我们有C#代码调用C++/CLI包装器.
标准的东西,到目前为止.
但是我们有很多情况允许将原生C++异常传播到.Net世界,并且我们依赖.Net将这些包装为System.Exception对象的能力,并且在大多数情况下这很好.
但是,我们发现当异常传播时,不会调用throw的范围内对象的析构函数!
经过一些研究,我们发现这是一个众所周知的问题.然而,解决方案/解决方案似乎不太一致.我们确实发现,如果使用/ EHa而不是/ EHsc编译本机代码,问题就会消失(至少在我们的测试用例中).但是我们更喜欢使用/ EHsc,因为我们自己将SEH异常翻译成C++异常,我们宁愿让编译器有更多的优化空间.
是否还有其他解决方法可以解决此问题 - 除了在(本机)try-catch-throw(除C++/CLI层之外)中包含跨本机管理边界的每个调用之外?
有一种不太常见的C++习语,我过去常常使用过好几次.我似乎无法记住它是否有一个通常使用的名称来描述它.
它与mixins,CRTP和类型擦除有一定关系,但并不是特别相关.
当您想要向类添加一些实现时,会发现问题,但您不希望将它放在类或它派生的任何类中.这样做的一个原因可能是类可能是继承层次结构的一部分,其中实现应该只发生一次.
暂时搁置一些问题,例如层次结构是否应该具有具体的非叶类,或者在某些情况下是否可以选择虚拟继承,我知道在模板类中提供实现的一种解决方案来源于它的模板参数.然后,这允许您在创建实例时使用模板,但之后只能通过指针使用对象或引用其中一个基础(在松散的意义上,类型擦除的位置).
一个例子可能是你有一个侵入性引用计数.你的所有类都来自一个引用计数接口,但你只希望引用计数本身和引用计数方法的实现出现一次,所以你将它们放在派生模板中 - 让我们调用它ImplementsRC<T>.现在你可以像这样创建一个实例:
ConcreteClass* concrete = new ImplementsRC<ConcreteClass>();
Run Code Online (Sandbox Code Playgroud)
我正在掩盖诸如由多个模板化重载等组成的转发构造函数.
所以,希望我已经明确了成语是什么.现在回到我的问题 - 这个成语是否有一个被接受的,或者至少是一般使用的名字?
假设你有一个类声明,例如:
class MyClass
{
int myInt=7;
int myOtherInt;
}
Run Code Online (Sandbox Code Playgroud)
现在,在通用代码中是否有一种方法,使用反射(或任何其他方法),我可以推断myInt已分配默认值,而myOtherInt则没有?注意用显式默认值初始化和保留默认值的默认值之间的区别(myOtherInt默认初始化为0).
根据我自己的研究,看起来没有办法做到这一点 - 但我想在放弃之前我会问这里.
[编辑]
即使有可空和引用类型,我也希望在那些保留为null的那些和已经显式初始化为null的那些之间进行distingush.这样我可以说具有初始化的字段是"可选的"而其他字段是"强制的".目前我不得不使用属性来做这件事 - 在这种情况下,这会让我感到信息冗余.
从谷歌搜索它看起来像XCode(在我的情况下3.1)应该至少试图给我一个理智的STL容器调试视图 - 或至少矢量.
但是,每当我在调试器中查看向量时,我只看到M_impl,有M_start和M_finish成员(以及其他几个) - 但中间没有任何东西!(这是一个调试版本,顺便说一句).
我错过了某个地方或某个地方吗?
我还读到有些宏可用于进一步增强调试查看器以检查更复杂的容器 - 但一直无法找到.
我也希望能够查看std :: wstrings,而不必放入内存查看器.它显示std :: string很好.有什么我可以做的显示std :: wstring?
我意识到这是一个复合问题 - 但它确实是同一主题的一部分.任何完整或部分回复表示赞赏!
我们这些拥有iPhone应用程序(已发布或未发布)的人可以使用ad-hoc分发发送有限的beta版本.虽然苹果公司的文档中有一些漏洞,但有很多博客,帖子和其他文章在"网络"上填补了空白.
但是,有一件事我没有看到任何人提及,我很好奇:当你进行测试版时,你是否使用与你发布的(或即将发布的)应用程序相同的应用程序ID?
使用不同ID的论点是,测试版仍然可以与发布的应用程序一起运行.如果您已在该字段中已发布版本,这可能更重要.
反对的论点是,测试版无法访问已发布的应用程序可能生成的任何数据,反之亦然.根据具体情况,这可能是您想要的,也可能不是.
这种方法有什么问题吗?我目前只有一个应用程序ID注册,但IIRC没有障碍只是创建更多必要的..?
有兴趣听听其他人在做什么.
我刚刚和Suave.io一起跑步.我确信随着我越来越多地进入Applicatives,这将变得更加清晰 - 但从高层次来看,我无法看到如何编写pathScan适用于request应用程序的规则.我找到的所有例子只做一个或另一个.在这两种情况下,它们都被应用于一个带参数的函数 - 所以推测这些参数也会以某种方式结合起来.
我有一个带有(id)参数的init方法:
-(id) initWithObject:(id) obj;
Run Code Online (Sandbox Code Playgroud)
我试着像这样称呼它:
[[MyClass alloc] initWithObject:self];
Run Code Online (Sandbox Code Playgroud)
但是XCode抱怨该参数是一个"不同的Objective-C类型"(通常表示类型不匹配或间接错误的级别).
如果我明确地将自己转换为(id)警告就会消失.在任何一种情况下,代码都按预期运行.有趣的是,在下一行我将自己传递给另一个也带有id的方法,并且工作正常.
我想知道我是否遗漏了一些微妙的东西 - 或者它是编译器的特性?
直到我确定为什么必要的原因,我才完全放心.
[编辑]
我被要求提供更多代码.不确定还有其他相关的东西.这是我打电话的实际代码.请注意,它本身就是一个init方法.这是initWithSource给出警告的呼吁:
-(id) initWithFrame:(CGRect) frame
{
self = [super initWithFrame: frame];
if( self )
{
delegate = nil;
touchDelegate = [[TBCTouchDelegate alloc] initWithSource:self];
[touchDelegate.viewWasTappedEvent addTarget: self action:@selector(viewWasTapped:)];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这是调用的init方法:
-(id) initWithSource:(id) sourceObject
{
self = [super init];
if (self != nil)
{
// Uninteresting initialisation snipped
}
return self;
}
Run Code Online (Sandbox Code Playgroud) 这可能看起来像是一个问题,但我正在看这个,因为我听到有人声称你必须在FileStream上调用Close(),即使它在一个使用块中(并且他们有代码,其中调用Close())就在街区尽头).
我知道Close()意味着调用Dispose(),但我认为我看起来更深,因为这是.Net 1.1代码,我的大部分经验都是2.0.
令我印象深刻的是,FileStream的MSDN文档为.Net 2.0启用了Dispose()和Dispose(bool),但只为.Net 1.1启用了Dispose(bool).
我认为这可能是一个疏忽,所以我使用Reflector查看一个程序集 - 我也看到Dispose(bool),但没有Dispose().
它是否正确?如果是这样,这里的故事是什么?FileStream在一个使用块中工作 - 我认为它必须实现IDisposable,据我所知,它只声明Dispose().
是否有一些编译器魔法正在进行,或者我在某处错过了隐藏的Dispose()实现(可能是调用Dispose(true)或Dispose(false)?)
最后(没有双关语),你能否确认在使用块中使用FileStream的范围将在.Net 1.1中的范围出口处关闭流?
[编辑]
只是为了澄清,这是C#代码.我知道VB.Net在.Net 2.0之前没有得到using语句,但我的理解是C#在1.1中有它(我的1.1代码在这里有它并编译)
玩弄后position()白白我周围的Googling的解决方案,并来到这个旧的计算器问题这几乎描述了我的问题.
区别在于我希望其中的位置是动态的,而不是文档的连续部分.
为了说明我将修改链接问题中的示例以符合我的要求.请注意,每个<b>元素都在不同的<a>元素中.这是关键的一点.
<root>
<a>
<b>zyx</b>
</a>
<a>
<b>wvu</b>
</a>
<a>
<b>tsr</b>
</a>
<a>
<b>qpo</b>
</a>
</root>
Run Code Online (Sandbox Code Playgroud)
现在,如果我查询,使用XPath,a/b我将得到四个<b>节点的节点集.然后我想找到包含该字符串的节点的该节点集内的位置'tsr'.另一篇文章中的解决方案在这里分解:count(a/b[.='tsr']/preceding-sibling::*)+1返回1因为preceding-sibling导航文档而不是上下文节点集.
是否可以在上下文节点集中工作?
c# ×2
c++ ×2
iphone ×2
.net ×1
.net-1.1 ×1
adhoc ×1
app-id ×1
beta ×1
buffering ×1
c++-cli ×1
casting ×1
cocoa ×1
crtp ×1
debugging ×1
default ×1
destructor ×1
dispose ×1
distribution ×1
exception ×1
filestream ×1
idioms ×1
macos ×1
mixins ×1
nodesets ×1
objective-c ×1
position ×1
raii ×1
reflection ×1
stl ×1
suave ×1
type-erasure ×1
using ×1
xcode ×1
xml ×1
xpath ×1