Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用swift捕获NSMallocExceptioni_Ios_Objective C_Swift_J2objc_Xz - Fatal编程技术网

Ios 使用swift捕获NSMallocExceptioni

Ios 使用swift捕获NSMallocExceptioni,ios,objective-c,swift,j2objc,xz,Ios,Objective C,Swift,J2objc,Xz,我的用户有时会发现以下错误: myapp(7383,0x1a1471000)malloc:*马赫数虚拟映射(大小=67125248)失败 (错误代码=3) 错误:无法分配区域 在malloc_error_break中设置断点以调试2017-04-06 20:33:58.152 myapp[7383:3724816]由于未捕获而终止应用程序 异常“NSMallocException”,原因:“NSAllocateObject(): 尝试分配类“IOSByteArray”的对象失败 *第一次抛出调用

我的用户有时会发现以下错误:

myapp(7383,0x1a1471000)malloc:*马赫数虚拟映射(大小=67125248)失败 (错误代码=3) 错误:无法分配区域 在malloc_error_break中设置断点以调试2017-04-06 20:33:58.152 myapp[7383:3724816]由于未捕获而终止应用程序 异常“NSMallocException”,原因:“NSAllocateObject(): 尝试分配类“IOSByteArray”的对象失败 *第一次抛出调用堆栈:(0x183386db0 0x1829ebf80 0x183386cf8 0x183c6b34c 0x10076e6e4 0x10097d3ec 0x10097e35c 0x100977dd4 0x100977bd8 0x100978ff8 0x10096c950 0x10099685c 0x100997360 0x100979ca4 0x100976dcc 0x1002ec30c 0x100332fe4 0x100332e18 0x1003740c4 0x1004070f8 0x1004064ac 0x1021089b0 0x10210806c 0x1021089b0 0x102107710 0x1004072d8 0x1021087ec 0x1004071b0 0x102126bbc 0x10207b2d8 0x10207b374 0x188613dc4 0x1886d17d4 0x18878f0c8 0x18879ca80 0x1884ce5a4 0x18333c728 0x18333a4cc 0x18333a8fc 0x183264c50 0x184b4c088 0x188546088 0x100382a60 0x182e028b8)libc++abi.dylib:以的未捕获异常终止 类型异常

问题是我找不到错误的调用堆栈。 我正在使用j2objc应用程序将XZJava库移植到objc库中。 所以,我可以使用这个库,但我不能捕捉这个错误

Google Analytics为我提供了帮助,并展示了这一行:

“&exd”= “NSMallocException\n链接:\n\nNSAllocateObject\nIOSByteArray\u NewArray\norgtukaanixzlzdecoder\u initWithInt\u with bytearray\u new\n Orgtukaanixzlzdeco”

因此,似乎出现了一个错误:

void OrgTukaaniXzLzLZDecoder_initWithInt_withByteArray_(OrgTukaaniXzLzLZDecoder *self, jint var1, IOSByteArray *var2) {
    NSObject_init(self);
        self->start_ = 0;
        self->pos_ = 0;
        self->full_ = 0;
        self->limit_ = 0;
        self->pendingLen_ = 0;
        self->pendingDist_ = 0;
        JreStrongAssignAndConsume(&self->buf_, [IOSByteArray newArrayWithLength:var1]);
        if (var2 != nil) {
            self->pos_ = JavaLangMath_minWithInt_withInt_(var2->size_, var1);
            self->full_ = self->pos_;
            self->start_ = self->pos_;
            JavaLangSystem_arraycopyWithId_withInt_withId_withInt_withInt_(var2, var2->size_ - self->pos_, self->buf_, 0, self->pos_);
        }
}
但我无法使用swift找到此错误:

do {
// ............
let inxz:OrgTukaaniXzXZInputStream = try OrgTukaaniXzXZInputStream(javaIoInputStream:in_)
// ..........
} catch {
print(error)
}

请帮帮我,Swift的try/catch与像这样的ObjC异常完全不同。只能使用ObjC使用
@try
@catch
捕获这些内容。用Swift是不可能的

也就是说,ObjC通常不是例外安全的。您必须非常小心地使用它们,在几乎所有情况下,异常发生后的正确行为都是使程序崩溃。在这种情况下,仅围绕对桥接函数的一次调用,可能可以有效地捕获和处理,但正确地执行它是一项相当微妙的技能,如果可以避免,则不建议这样做


几乎可以肯定,这个错误的原因是您试图分配太大的内容。我不会试图捕捉异常,而是会研究对象为什么如此大,并解决这个问题。特别是,我要看看
var1
有多大,并确保它在一个合理的范围内。还要确保它不是负面的。您使用的是
jint
这一事实表明,您可能会看到与整数类型不匹配的情况,我绝对认为这会导致此类崩溃。

Swift的try/catch与类似的ObjC异常完全不同。只能使用ObjC使用
@try
@catch
捕获这些内容。用Swift是不可能的

也就是说,ObjC通常不是例外安全的。您必须非常小心地使用它们,在几乎所有情况下,异常发生后的正确行为都是使程序崩溃。在这种情况下,仅围绕对桥接函数的一次调用,可能可以有效地捕获和处理,但正确地执行它是一项相当微妙的技能,如果可以避免,则不建议这样做


几乎可以肯定,这个错误的原因是您试图分配太大的内容。我不会试图捕捉异常,而是会研究对象为什么如此大,并解决这个问题。特别是,我要看看
var1
有多大,并确保它在一个合理的范围内。还要确保它不是负面的。事实上,您使用的是
jint
,这表明您可能会看到与整数类型不匹配的情况,我绝对认为这会导致这种崩溃。

多亏了@Sultan。他给了我一个使用XZ纯C库而不是Java>ObjC库的想法。现在这个崩溃不存在了。j2obc似乎是一个神奇的框架,但它却出现了罕见的无法修补的错误。

多亏了@Sultan。他给了我一个使用XZ纯C库而不是Java>ObjC库的想法。现在这个崩溃不存在了。j2obc似乎是wonder框架,但它有一些罕见的不可修补错误。

我正在使用带有内部回调的扩展/折叠内容的Eureka库。因此,用户多次尝试解码小xz数据。没有内存泄漏。我既不能理解也不能理解这个问题。无论如何,谢谢。似乎我必须手动编辑转换代码。我正在使用带有内部回调的扩展/折叠内容的Eureka库。因此,用户多次尝试解码小xz数据。没有内存泄漏。我既不能理解也不能理解这个问题。无论如何,谢谢。似乎我必须手动编辑转换代码。从j2objc@Sulthanexplain plzIt这似乎是仅从
LZMA2InputStream.java调用的翻译版本。我已经查看了代码,没有办法导致内存异常。要么内存处理转换错误,导致内存泄漏(在仪器中使用泄漏检测),要么字典大小的内部检查转换错误。这两种可能性都意味着翻译不正确。为什么不直接使用C版本呢?另一种可能性是,您使用的文件的字典大约为2GB,这应该是非常罕见的。@Sulthan,你的想法是10x。我已经实现了本机C库而不是j2obj。现在不要撞车了,快跑j2objc@Sulthanexplain plzIt这似乎是仅从
LZMA2InputStream.java调用的翻译版本。我已经查看了代码,没有办法导致内存异常。要么内存处理转换错误,导致内存泄漏(在仪器中使用泄漏检测),要么字典大小的内部检查转换错误。这两种可能性都意味着翻译