小编s3l*_*lph的帖子

UICollectionView中的高内存使用率

我目前的任务是iOS键盘扩展,其中包括所有iOS支持的表情符号(是的,我知道iOS有一个内置表情符号键盘,但目标是在键盘扩展中包含一个).

对于这个基本上应该是以网格顺序包含所有表情符号的滚动视图的表情符号布局,我决定使用UICollectionView,因为它只创建有限数量的单元格并重用它们.(有很多表情符号,超过1000个.)这些单元格只包含一个UILabel,它将表情符号作为文本,并使用GestureRecognizer插入抽头表情符号.

但是,当我滚动列表时,我可以看到内存使用量爆炸大约16-18MB到33MB以上.虽然这不会在我的iPhone 5s上触发内存警告,但它也可能在其他设备上,因为应用程序扩展仅专用于非常少量的资源.

编辑:有时我收到内存警告,主要是切换回"普通"键盘布局.大多数情况下,切换回来时内存使用量会降至20MB以下,但并非总是如此.

如何减少此表情符号布局使用的内存量?


class EmojiView: UICollectionViewCell {

    //...

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.userInteractionEnabled = true
        let l = UILabel(frame: self.contentView.frame)
        l.textAlignment = .Center
        self.contentView.addSubview(l)
        let tapper = UITapGestureRecognizer(target: self, action: "tap:")
        self.addGestureRecognizer(tapper)
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        //We know that there only is one subview of type UILabel
        (self.contentView.subviews[0] as! UILabel).text = nil
    }
}

//...

class EmojiViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    //...

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        //The …
Run Code Online (Sandbox Code Playgroud)

iphone memory-management ios uicollectionview swift

18
推荐指数
2
解决办法
3827
查看次数

从Java程序执行ADB命令

我正在处理的程序使用ADB(Android Debug Bridge)将文件发送到我的手机:

for (String s : files)
    String cmd = "adb -s 0123456789ABCDEF push " + s + " /mnt/sdcard/" + s;
    try {
        InputStream is = Runtime.getRuntime().exec(cmd).getInputStream();
        while (is.read() != -1) {}
    } catch (IOException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我希望程序等到ADB完成传输,但ADB作为守护进程运行,因此永远不会完成.但该程序仍在继续,不知何故文件没有发送到我的手机(日志中没有例外).当我从控制台运行命令时,它没有问题.

我究竟做错了什么?如何通过ADB正确发送文件?

注意:is.read() == -1它将不起作用,因为ADB守护程序将所有输出写入系统标准输出.我已经尝试将其转发到文本文件中.它保持空白,输出仍然写入终端

编辑:读取ADB进程的ErrorStream返回每个adb push命令的adb帮助.再次:确切的命令(从Eclipse控制台复制)在终端中工作

编辑2:使用ProcessBuilder而不是RUntime.getRuntime.exec()导致以下错误:

java.io.IOException: Cannot run program "adb -s 0123456789ABCDEF push "inputfile "outputfile""": error=2, File or directory not found
Run Code Online (Sandbox Code Playgroud)

在ProcessBuilder的start()-method中使用ADB( …

java process adb

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

iOS键盘扩展中的多个键盘布局

我目前正致力于iOS的键盘扩展,现在我想知道如何将多个布局支持集成到系统设置中.

在系统设置中,默认en_US键盘有一个附加菜单(由右侧的箭头指示),您可以从中选择多种键盘布局,如下面iOS模拟器的屏幕截图所示(iOS 9.1 13B137)

在此输入图像描述

这可以通过自定义键盘扩展来实现吗?我找不到任何文件.(这可能意味着它使用公共API是不可能的,或者我使用Google太愚蠢了.)我在网上搜索了很多,但我找到的大部分内容都是关于在Info.plist文件或说明中设置键盘区域设置关于如何使用不同语言(注册为不同的键盘)启用系统键盘,我想避免.

我可以看到一个替代方案,如果这不起作用,那将基本上在一个包装应用程序中创建多个键盘扩展,其中包括相同的代码库,但定义其他布局.然而,这看起来相当丑陋,使代码混乱,人们将不得不单独启用每个布局,从我的角度来看,这不是最用户友好的方法.如上所述,iOS附带了不同语言的不同键盘,但我试图为同一种语言提供多种键盘布局,所以这不是我想要的.

ios custom-keyboard ios8-extension

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

仅当文件不存在或已更改时 adb Push

对于一个程序,我使用 ADB 将文件从计算机传输到手机。

使用会adb push覆盖每个现有文件,因此需要很长时间才能完成。 adb sync仅当文件存在于手机上且包含本地版本以外的其他数据时才推送该文件。

有没有中途解决办法?如果文件不存在或已更改,我希望传输该文件,但如果该文件与计算机上的相同,则不传输该文件。有办法实现这一点吗?

adb

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

std::vector::erase 的时间复杂度

我找到了一种从 STL 向量中删除元素及其值的方法:

vec.erase(remove(vec.begin(), vec.end(), value), vec.end());
Run Code Online (Sandbox Code Playgroud)

现在我想知道这个方法的效率如何,即它的时间复杂度(以 Big O 表示法)。

c++ vector time-complexity

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

Xcode 7.2无法通过iOS 9.2连接到iPhone

出于开发目的,我已经在我的iPhone 5s上安装了iOS 9.2 beta.当然,我也安装了Xcode 7.2 beta.

当我想在设备上运行应用扩展程序(键盘)时,应用程序正确构建,安装在iPhone上并启动.然而,然后,我在Xcode中看到了这条消息:

无法启动"MyApp"

进程启动失败:无法获取进程任务

有谁知道如何解决这一问题?

编辑:如果Xcode 7.2的最终发布版本,消息更改为

无法启动"MyApp"

无法附加

debugging ios xcode7

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

搜索正则表达式模式以查找"禁止"字符

我已经google了很多,但我找不到任何解决方案.对于学校项目,我需要在字符串中找到不受支持的字符不受支持的字符.允许的是[A-Z\s].

我发现Pattern.match()只检查整个字符串是否与模式匹配.所以我尝试了这种模式:.*[^A-Z\\s].*

只要您在字符串中没有任何换行符,它就会起作用.为了检查它们,我也常常[.\\s]*[^A-Z\\s][.\\s]*处理它们,但现在没有任何工作了.

为此目的,正确的正则表达式是什么?

java regex newline regex-negation

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

OpenGL 不会在启用 GL_COLOR_ARRAY 的情况下绘制四边形

我正在尝试让以下代码正常工作:

GLfloat *vbuffer = new GLfloat[24] {
    0,0,0,
    10,0,0,
    0,10,0,
    0,0,10,
    10,10,0,
    10,0,10,
    0,10,10,
    10,10,10
};
GLubyte *cbuffer = new GLubyte[32] {
    255,0,0,255,
    0,255,0,255,
    0,0,255,255,
    255,255,0,255,
    255,0,255,255,
    0,255,255,255,
    0,0,0,255,
    255,255,255,255
};

GLuint *ibuffer = new GLuint[24] {
    0,1,4,2,
    0,2,6,3,
    0,3,5,1,
    1,4,7,5,
    5,7,6,3,
    2,6,7,4
};

//...

glColor4f(1,1,1,1);

glEnableClientState(GL_VERTEX_ARRAY | GL_COLOR_ARRAY);

glColorPointer(4, GL_UNSIGNED_BYTE, 0, cbuffer);
glVertexPointer(3, GL_FLOAT, 0, vbuffer);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, ibuffer);

glDisableClientState(GL_VERTEX_ARRAY | GL_COLOR_ARRAY);
Run Code Online (Sandbox Code Playgroud)

未绘制所需的立方体,而用 绘制的坐标轴glVertex3f始终出现。

当我删除GL_COLOR_ARRAYfrom时glEnableClientState,立方体将按照指示完全绘制为白色。

我究竟做错了什么?为什么 glColorPointer 的东西不起作用?


系统:

  • 库班图 13.04,64 位 …

c++ opengl

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

不使用sprintf或to_string将值插入字符串

目前我只知道将值插入C++字符串或C字符串的两种方法.

我所知道的第一种方法是使用std::sprintf()和C字符串缓冲区(char数组).

第二种方法是使用类似的东西"value of i: " + to_string(value) + "\n".

但是,第一个需要创建缓冲区,如果您只想将字符串传递给函数,则会导致更多代码.第二个产生长行代码,每次插入一个值时字符串都会被中断,这使代码更难读.

从Python我知道format()函数,使用如下:

"Value of i: {}\n".format(i)

大括号由格式中的值替换,并且.format()可以附加其他内容.

我真的很喜欢Python的方法,因为字符串保持可读性,不需要创建额外的缓冲区.在C++中有没有类似的方法呢?

c++ string-formatting

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

ArrayList由被调用的方法操纵

我目前使用Java 8遇到以下问题:

我想将ArrayList<String>as参数传递给另一个方法.除其他外,此方法从给定的ArrayList中删除一个对象:

public static void calledMethod(String item, ArrayList<String> list) {
    list.remove(item);
}
Run Code Online (Sandbox Code Playgroud)

现在我尝试从main调用这个方法:

ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();  //<-
    calledMethod(item, list);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,JVM 在上面代码()的标记行返回java.util.ConcurrentModificationException//<-.据我所知,这意味着列表在迭代时被修改.但这怎么可能发生呢?据我所知,Java通过值手工方法参数,而不是通过引用.如果我calledMethod在main方法中使用以下代码调用,则不会发生错误:

ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();  //<-
    calledMethod(item, (ArrayList<String>) list.clone());
}
Run Code Online (Sandbox Code Playgroud)

所以将克隆的对象传递给calledMethod工作.这有什么不对?


java -version:Java SE运行时环境(版本1.8.0_20-b26)

我在Linux Mint 64bit上使用Oracle Java.

java arraylist

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