小编nee*_*vek的帖子

子目录中的资源文件将复制到应用程序包的根目录

我不确定这是预期还是错误.我试图在磁盘中创建与XCode相同的文件夹结构.我使用以下步骤将资源文件添加到我的项目:

  1. Resources在项目的根文件夹下创建一个文件夹.
  2. Resources文件夹拖到XCode,Group为该文件夹创建一个.
  3. 将我的资源文件拖到XCode中FinderResources文件夹.

现在我可以看到Build Phrases- > 中列出了所有资源文件Copy Bundle Resources.

奇怪的是[[NSBundle mainBundle] pathForResource:@"book" ofType:@"epub"]返回一个可以定位的文件路径,同时[[NSBundle mainBundle] pathForResource:@"book" ofType:@"epub" inDirectory:@"Resources"]返回(null).

Build Results窗口,我注意到这一行:

CpResource MBookReader/Resources/book.epub /Users/neevek/Library/Developer/Xcode/DerivedData/workspace-fykuaikryknuhxgevcdtspkspptj/Build/Products/Debug-iphonesimulator/MBookReader.app/book.epub
cd /Users/neevek/workspace/xcode_projects/MBookReader
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Users/neevek/workspace/xcode_projects/MBookReader/MBookReader/Resources/book.epub /Users/neevek/Library/Developer/Xcode/DerivedData/workspace-fykuaikryknuhxgevcdtspkspptj/Build/Products/Debug-iphonesimulator/MBookReader.app
Run Code Online (Sandbox Code Playgroud)

这表明Resources/book.epub文件确实被复制到MBookReader.app/(应用程序包的根目录).

现在Resources是磁盘中的真实文件夹,为什么不复制文件夹本身?

PS.我正在使用XCode 4.3.2.

directory resources xcode

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

检测插座断开?

我有点不高兴,这不能以优雅的方式处理,在尝试了几个SO问题的答案中提到的不同解决方案(这个,这个和其他几个)后,我仍然无法检测到插座断开(通过拔掉电缆).

我正在使用NIO非阻塞套接字,一切都很完美,除了我找不到检测服务器断开的方法.

我有以下代码:

while (true) {
    handlePendingChanges();

    int selectedNum = selector.select(3000);
    if (selectedNum > 0) {
        SelectionKey key = null;
        try {
            Iterator<SelectionKey> keyIterator = selector.selelctedKeys().iterator();
            while (keyIterator.hasNext()) {
                key = keyIterator.next();
                if (!key.isValid())
                    continue;

                System.out.println("key state: " + key.isReadable() + ", " + key.isWritable());

                if (key.isConnectable()) {
                    finishConnection(key);
                } else if (key.isReadable()) {
                    onRead(key);
                } else if (key.isWritable()) {
                    onWrite(key);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("I am happy that I can catch …
Run Code Online (Sandbox Code Playgroud)

java sockets nio

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

当使用GCD调用时,UIWebView stringByEvaluatingJavaScriptFromString在iOS5.0/5.1上挂起

我有以下代码viewDidLoad,它在iOS 4.3上正常工作,但它挂在iOS 5/5.1上.在iOS 5/5.1上,显示警告对话框但无法解除,UI线程冻结,无法单击确定按钮.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self.webview stringByEvaluatingJavaScriptFromString:@"alert('HELLO WORLD!')"];
    });
});
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

objective-c uiwebview grand-central-dispatch ios

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

智能指针作为地图键

我有以下代码来测试智能指针作为键std::map,我在Mac和Linux上运行代码,但我观察到不同的输出,是一个错误还是我做错了什么?

#include <iostream>
#include <memory>
#include <string>
#include <map>

using namespace std;

class Dog {
 public:
   typedef shared_ptr<Dog> sptr;

   Dog(const string &name) : name_(name) { }

   friend bool operator<(const Dog &lhs, const Dog &rhs) {
     cout << "Dog::operator< called" << endl;
     return lhs.name_ < rhs.name_;
   } 

   friend bool operator<(const sptr &lhs, const sptr &rhs) {
     cout << "Dog::operator< sptr called" << endl;
     return lhs->name_ < rhs->name_;
   } 

 private:
   string name_;
};

void test_raw_object_as_map_key() {
  cout << "raw object …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers map shared-ptr c++11

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

Perl,为什么@INC不同?

我有一个简单的Perl脚本,打印出来@INC如下:

#!/usr/bin/perl
print $_, "\n" for @INC;
Run Code Online (Sandbox Code Playgroud)

我用两种不同的方式执行脚本./test.plperl test.pl,输出如下所示:

[neevek@~/bin]$ ./test.pl 
/Library/Perl/5.12/darwin-thread-multi-2level
/Library/Perl/5.12
/Network/Library/Perl/5.12/darwin-thread-multi-2level
/Network/Library/Perl/5.12
/Library/Perl/Updates/5.12.3
/System/Library/Perl/5.12/darwin-thread-multi-2level
/System/Library/Perl/5.12
/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.12
.   
[neevek@~/bin]$ perl test.pl 
/opt/local/lib/perl5/site_perl/5.12.3/darwin-multi-2level
/opt/local/lib/perl5/site_perl/5.12.3
/opt/local/lib/perl5/vendor_perl/5.12.3/darwin-multi-2level
/opt/local/lib/perl5/vendor_perl/5.12.3
/opt/local/lib/perl5/5.12.3/darwin-multi-2level
/opt/local/lib/perl5/5.12.3
/opt/local/lib/perl5/site_perl
/opt/local/lib/perl5/vendor_perl
.   
Run Code Online (Sandbox Code Playgroud)

我的问题是:用./script.pl和执行perl脚本的幕后操作是perl script.pl什么?是什么导致脚本输出不同@INC

perl library-path

9
推荐指数
2
解决办法
2607
查看次数

什么是OpenGL中的插值?

我刚刚开始学习OpenGL ES 2.0,在这个过程中我遇到了一些对我来说没有意义的术语,即使有定义.像这样:插值

OpenGL ES 2.0编程指南一书中,我看到了插值的这个定义:

用于从分配给图元的每个顶点的变化值为每个片段生成变化值的机制称为插值.

虽然我理解这个答案Linear Interpolation是什么,但上面的定义对我来说没有意义.

你会用另一种方式做一个例子来详细说明插值是什么吗?

opengl-es

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

带有多线程的Java NIO SocketChannel.read()

我正在使用Java NIO实现一个简单的文件服务器,其中包含一个选择线程和多个工作线程(用于执行实际读/写).

代码的主要部分如下所示:

while (true) {
    int num = selector.select();
    if (num > 0) { 
        Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
        final SelectionKey key = keys.next();
        keys.remove();

        if (key.isValid()) {
            if (key.isAcceptable()) {
                accept(key);
            } else if (key.isReadable()) {
                performReadInWorkerThread (key);
            } else if (key.isWritable()) {
                performWriteInWorkerThread (key);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从代码片段中可以看出,当选择可读/可写通道时,我将读/写从选择线程卸载到工作线程.

现在的问题是当一个可读通道被移交给工作线程时,在它完成/开始从通道读取之前,选择线程再次循环,并selector.select()选择先前选择的可读通道(因为通道中仍有输入缓冲区)由于先前分配的工作线程尚未完全消耗,所以通道再次移交给另一个工作线程,导致多个工作线程读取同一个通道.

我相信这是一个设计问题.我的问题是如何确保只有一个线程同时读取一个频道?

java multithreading nio

7
推荐指数
1
解决办法
4639
查看次数

坚持理解Objective-c中的动态绑定

我刚开始学习Objective-C,我读的Objective-C的第三版编程斯蒂芬·G·库奇.

有一段解释多态性机制:

在运行时,Objective-C运行时系统将检查存储在dataValue1(id对象)中的对象的实际类,并从正确的类中选择适当的方法来执行.但是,在更一般的情况下,编译器可能会生成错误的代码以将参数传递给方法或处理其返回值.如果一个方法将一个对象作为其参数而另一个方法采用浮点值,则会发生这种情况.例.或者,例如,如果一个方法返回一个对象而另一个方法返回一个整数.如果两个方法之间的不一致只是一个不同类型的对象(例如,Fraction的add:方法将Fraction对象作为其参数并返回一个,而Complex的add:方法接受并返回一个Complex对象),编译器将仍然生成正确的代码,因为无论如何内存地址(即指针)都作为对象的引用传递.

我不太明白段落的第一部分说如果我在具有相同名称和不同类型参数的不同类中声明2个方法,编译器可能会生成错误的代码.虽然段落的最后一部分说有两个方法具有相同的名称和不同的参数并且返回类型是好的...哦不...

我有以下代码,他们编译并运行正常:

@implementation A
- (int) add:(int)a {
    return 1 + a;
}
@end
@implementation B
- (int) add: (B*) b {
    return 100;
}
@end
id a = [[A alloc] init];
id b = [[B alloc] init];
NSLog(@"A: %i, B %i", [a add:100], [b add:b]);
Run Code Online (Sandbox Code Playgroud)

编辑:正如我引用的文本,上面的代码应该会导致错误,但它只会产生一些警告消息,找到名为"add:"的多个方法,不兼容指向整数转换的指针,将"id"发送到类型为"int"的参数

我有Java和C++背景,我知道Objective-C中的多态性与那些语言略有不同,但我仍然对不确定性感到困惑(粗体文本).

我想我一定是误解了一些东西,请你详细解释一下Objective-C中的动态绑定对于我和那些需要它的人吗?

谢谢!

objective-c dynamic-binding

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

无法停止使用ExecutorService启动的任务

对不起,我必须打开一个新线程来描述这个问题.

今天早上我问了这个问题,有一些回复,但我的问题仍未解决.

这次我将附加一些可运行的代码(简化但有相同的问题),以便您重现问题:

public class ThreadPoolTest {
    public static void main(String[] args) throws Exception {
        final ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
        Future<Void> futures[] = new Future[5];
        for (int i = 0; i < futures.length; ++i)
            futures[i] = startTask(taskExecutor);

        for (int i = 0; i < futures.length; ++i)
            System.out.println("futures[i].cancel(true): " + futures[i].cancel(true));

        System.out.println("Cancel DONE.");
        taskExecutor.shutdown();
    }

    private static Future<Void> startTask(final ExecutorService taskExecutor) {
        Future<Void> f = taskExecutor.submit(new Callable<Void>() {
            public Void call() throws Exception {
                try {
                    downloadFile(new URI("http://stackoverflow.com"));
                    while(true) …
Run Code Online (Sandbox Code Playgroud)

java concurrency executorservice

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

自定义协议的应用程序数据是否需要校验和?

由于通过网络传输的数据包在不同的层具有校验和,因此以太网和 IPv4的标头具有校验和,因此TCP的校验和甚至覆盖了整个段。

我知道,从应用程序层的角度来看,损坏的数据包可以滑入而不被以太网/ IP / TCP丢弃是不可能的,因为它们的校验和有可能是正确的,只有概率很小。

我正在为IM应用程序设计自定义二进制协议。我的问题是我需要添加校验和以确保我的应用程序数据的完整性吗?在实践中真的需要校验和吗?

networking network-programming protocols network-protocols data-integrity

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

纹理同时用作着色器程序的FBO颜色附件和sampler2D

我创建了一个FBO,并将纹理绑定为其颜色附件,我有多个着色器程序对纹理进行一些后期处理,一切都很好,但对我来说没有意义,纹理可以用作输入(sampler2D)以及着色器的输出的同时.

以下是我采取的步骤:

  1. 创建一个FBO fboA.
  2. 创建一个纹理textureA,并将其绑定为颜色附件fboA.
  3. 调用glBindFrameBuffer绑定fboA到framebuffer目标.
  4. 打电话glUseProgram使用着色器程序shaderA.
  5. 调用glDrawArrays绘制的东西(最终绘制textureA因为fboA当前是绑定的).
  6. 调用glUseProgram以使用在片段着色器中shaderB具有sampler2D统一的着色器程序.
  7. 绑定textureAsampler2D着色器程序的统一shaderB.
  8. 在片段着色器中,textureA用于设置fragColor.

我最困惑的是最后两个步骤,其中textureA用作片段着色器的输入,仍然绑定到当前帧缓冲区.在我看来,片段着色器正在读取和写入同一块内存,这不是某种未定义的行为,为什么它仍能正常工作?

opengl fbo textures

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

为什么移动ctor比复制ctor慢?

我有以下代码来测试复制ctor并移动std::string类的ctor,结果让我感到惊讶,移动ctor 比复制ctor慢约1.4倍.

据我所知,移动构造不需要分配内存,因为在这种std::string情况下,移动构造对象中可能有一个内部指针直接设置为移动对象的内部指针,它应该比为缓冲区分配内存更快然后在复制构造时复制对象中的内容.

这是代码:

#include <string>
#include <iostream>

void CopyContruct(const std::string &s) {
  auto copy = std::string(s);
}

void MoveContruct(std::string &&s) {
  auto copy = std::move(s);
  //auto copy = std::string(std::move(s));
}

int main(int argc, const char *argv[]) {
  for (int i = 0; i < 50000000; ++i) {
    CopyContruct("hello world");
    //MoveContruct("hello world");
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

从这两个函数的汇编中,我可以看到,因为MoveConstruct有一个std::remove_reference类模板的实例化,我认为这应该是罪魁祸首,但我不熟悉汇编,任何人都可以详细说明吗?

以下代码在https://godbolt.org/上使用x86-64 gcc7.2进行了反编译:

CopyContruct(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
  push rbp
  mov …
Run Code Online (Sandbox Code Playgroud)

c++ performance move copy-constructor c++11

0
推荐指数
1
解决办法
93
查看次数

如果我已经有了像 epoll/kqueue/IOCP 这样的非阻塞 IO,为什么还需要 async/await?

我对非阻塞 IO 库epoll及其高级抽象有经验libuv,因此当我开始学习 Rust 时,我寻找 Rust 等效项并找到了 Mio。Mio 的工作方式符合我对非阻塞 IO 的理解,并且对我来说很熟悉。我可以轻松地使用这种 API 来使用多个线程甚至单个线程构建高性能服务器应用程序。

Rust 1.39 带来了async/await语法。我读过一些关于它的文章和文档,感觉就像协程。我知道.await可以用来让 CPU 在同一线程中执行其他操作,但是没有简单的方法可以动态调度代码在该线程中运行,它不能以事件方式工作epoll,比如我可以注册提前发生事件并在这些事件发生时收到通知。

async打开和读取文件的/示例await对我来说没有意义,因为在该示例中,我除了等待内容可用之外.await什么都不做,所以我仍然处于阻塞状态,根本不是异步的。

如果我使用像 Mio 或unsafe 这样的非阻塞 IO epoll,我还需要async/吗await?如果不是,什么情况下应该使用async/ await

nonblocking rust async-await

0
推荐指数
1
解决办法
1241
查看次数