我正在转换到ARC(自动引用计数),这个文档非常有用:转换到ARC发行说明.它说:
块如何在ARC中工作?
在ARC模式下向块传递块时块"正常工作",例如在返回中.您不必再调用Block Copy.将堆栈"向下"传递给arrayWithObjects:以及其他执行保留的方法时,仍然需要使用[^ {} copy].
有人可以详细说明这一点或举一些例子吗?我明白这通常意味着我不需要再进行[块复制],即使块在声明的范围之外使用,因为ARC现在会更加巧妙地处理它,但我仍然需要在我想要时复制它将块传递给保留它的函数.它是否正确?
实际上我已经尝试了一点点,到目前为止,即使我没有复制将块传递给数组也没关系,所以这个问题.谢谢!
我正在使用libxml2.2.7.3来解析html页面,并且我很难在HTML中使用CDATA正常工作.这是代码:
xmlDocPtr doc = htmlReadMemory(data, length, "", NULL, 0);
xmlBufferPtr buffer = xmlBufferCreate();
xmlNodeDump(buffer, doc, doc->children, 0, 0);
printf("%s", (char*)buffer->content);
Run Code Online (Sandbox Code Playgroud)
和HTML数据:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><body>
<div>
<script type="text/javascript">
//<![CDATA[
document.write('</div>');
//]]>
</script>
</div>
</body></html>
Run Code Online (Sandbox Code Playgroud)
解析器错误地将引号内的</ div>识别为真正的html标记,并打印出错误消息,如下所示:
:8: HTML parser error : Unexpected end tag : script
</script>
^
:9: HTML parser error : Unexpected end tag : div
</div>
^
打印出来的结果和调试也意味着解析出错了:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><body>
<div>
<script type="text/javascript"><![CDATA[ … 我正在尝试使用 multipart/form-data 内容类型发布文件,我得到了这个问题:
当我写入文件内容时,我不应该转义 CRLF 吗?我在网上找到了一段代码,我认为它可能是错误的:
NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: url];
[req setHTTPMethod: @"POST"];
NSString* contentType = @"multipart/form-data, boundary=AaB03x";
[req setValue:contentType forHTTPHeaderField: @"Content-type"];
NSData* boundary = [@"\r\n--AaB03x\r\n" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData: boundary];
[postBody appendData: [@"Content-Disposition: form-data; name=\"datafile\"; filename=\"t.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: [@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: imageData];
[postBody appendData: boundary];
[req setHTTPBody:postBody];
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为 imageData 可能包含 \r\n 序列,对吧?如果是这样,有没有办法在原始数据中转义 CRLF?或者我错过了什么?
提前致谢!
好吧,我知道这个问题已经被问过几次了,但我需要针对我的具体情况的建议。有 Encodable 和 Decodable 之分,消息既是 Encodable 又是 Decodable:
interface Encodable { void encode(); }
interface Decodable { void decode(); }
class Message implements Encodable, Decodable { ... }
void processEncodable(Encodable encodable) {
...
encodable.encode();
...
}
Run Code Online (Sandbox Code Playgroud)
除了 Message 之外,还有其他 Encodable(和 Decodable),它们需要在 processEncodable 中进行处理。到目前为止一切顺利,但问题是我想从包外部隐藏encode()和decode(),并且Java接口不允许受保护/私有方法。有人可能会建议抽象类,但正如您所看到的,Message 应该同时继承 Encodable 和 Decodable,所以情况并非如此。有什么建议么?
这些天我非常喜欢 Scala,Scala 特征允许受保护/私有方法,恕我直言,这更直观。我已经浏览了一些提到Java接口设计理念的答案,但我真的不明白为什么如果引入接口作为多重继承的替代方案,那么它不应该允许受保护的方法,而抽象类则允许......
以下是我真正问题的简化版本:
class Z[T]
object E extends Enumeration {
implicit val z = new Z[Value]
val X, Y = Value
}
implicit def f[T : Z] = (getter: T) => 0
implicit def o[T](v: Option[T])(implicit toInt: T => Int) = 0
def e: Option[E.Value] = null
val b: Int = e
Run Code Online (Sandbox Code Playgroud)
这有效,b隐式转换为o(e)(f(Ez)).但随着以下小变化:
implicit def f[T : Z] = (setter: T => Unit) => 0
implicit def o[T](v: Option[T])(implicit toInt: (T => Unit) => Int) = 0
Run Code Online (Sandbox Code Playgroud)
它找不到合适的隐含值Ez,尽管与原始代码没有本质区别,而手动显式转换为o(e)(f(Ez))仍然有效.
我知道隐式参数的实现还没有完成,还有很多未解决的问题.如果这是其中之一,我想向Scala贡献者报告.所以我的问题是,a)这真的是一个错误吗?b)如果是这样,我在哪里以及如何提交错误以便将来修复?
UPDATE
特拉维斯的回答就像一个魅力!顺便说一下,上面的代码解决了我原来的问题:
implicit …Run Code Online (Sandbox Code Playgroud) 我有以下语法:
rule: 'aaa' | 'a' 'a';
Run Code Online (Sandbox Code Playgroud)
它可以成功解析字符串'aaa',但它无法解析'aa'并出现以下错误:
line 1:2 mismatched character '<EOF>' expecting 'a'
Run Code Online (Sandbox Code Playgroud)
仅供参考,这是词法分析器的问题而不是解析器,因为我甚至没有调用解析器.主要功能如下:
@members {
public static void main(String[] args) throws Exception {
RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
System.out.println(t.getType());
}
}
Run Code Online (Sandbox Code Playgroud)
结果与更明显的版本相同:
rule: AAA | A A;
AAA: 'aaa';
A: 'a';
Run Code Online (Sandbox Code Playgroud)
显然,ANTLR词法分析器尝试将输入'aa'与失败的规则AAA匹配.除了ANTLR是一个LL(*)解析器或其他什么,词法分析器应该与解析器分开工作,它应该能够解决歧义.语法在良好的旧lex(或flex)下运行良好,但在ANTLR中似乎没有.那么这里的问题是什么?
谢谢您的帮助!
我们考虑以下几点:
object Foo {
val BUFFER_SIZE = 1024
}
class Foo {
.
.
.
val buffer = new Array[Byte](Foo.BUFFER_SIZE)
Run Code Online (Sandbox Code Playgroud)
与Java的静态(最终)变量相比,这太冗长了,似乎并不优雅,特别是因为常量的定义和用法太远,无法立即理解代码.我想要的是这样的:
class Foo {
val BUFFER_SIZE = 1024
val buffer = new Array[Byte](BUFFER_SIZE)
Run Code Online (Sandbox Code Playgroud)
问题是,Scala编译器是否足够聪明,不能为每个Foo实例实例化BUFFER_SIZE以浪费时间和空间?或者应该与第一个一起去?
我正在查看scala actors库,在那里我找到了以下代码:
private[scheduler] trait TerminationMonitor {
_: IScheduler =>
protected var activeActors = 0
...
Run Code Online (Sandbox Code Playgroud)
问题是_的含义是什么:IScheduler =>在这里?
我是Scala的新手,让我感到困惑的是,下划线有很多不同的含义.
感谢您的帮助!
我正在尝试基于经典工作池模型创建一个Scala应用程序服务器.鉴于:
corePoolSize最大化性能的最佳价值是什么?理想情况下,当工作线程池的大小等于处理器核心数时,性能最大化.所以在这种情况下,我猜最好的值是5(调度程序为1,工作程序为4),或者我可以将值设置为4并覆盖调度程序actor的调度程序方法,这样它就不会与工作人员共享线程池.
它是否正确?任何建议表示赞赏 谢谢!