*** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Source

本文探讨了UITableView在iOS应用中出现cell高度为NaN的问题及其原因,并提供了两种解决方案:一是通过在heightForRow方法中增加判断逻辑来规避;二是修正cell高度计算逻辑,确保返回正确的CGFloat值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableViewRowData.m:619



*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'table view row height must not be negative - provided height for index path (<UIMutableIndexPath 0x7fc9a368f0b0> 2 indexes [0, 0]) is nan'



报错原因是  在tableview的heightForRow方法里返回的数据错误,返回的数据是nan型的,为什么是nan呢,猜测可能是数据越界,你可能得到到的是double类型,而heightforrow需要的是CGFloat类型


解决方法:

1.在heightforrow方法里 做出判断

return (!isnan([LDCompanyDynamicCellgetCellHeight]))?[LDCompanyDynamicCellgetCellHeight]:70;


1在数据原始处修改,

+(CGFloat)getCellHeight:(LDCompanyModel *)company{
    CGFloat intervalY = 5.0;
    
    CGFloat y;


    y+=55+intervalY;
    
    if (company.industry) {
        //协会认证
        CGSize industrySize = [company.industry sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake([UIScreen mainScreen].bounds.size.width-76-10, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
        y+=floor(industrySize.height)+intervalY;
    }else{
        y+=intervalY;
    }
    NSLog(@"y1-----%f",y);
    y=floor(y);
    NSLog(@"y2-----%f",y);
    return y;
}

这是获取cell高度,打印的数据

2014-10-09 18:58:39.661 LiuDuSpace[7090:248073] y1-----79.000000
2014-10-09 18:58:39.661 LiuDuSpace[7090:248073] y2-----79.000000
2014-10-09 18:59:36.842 LiuDuSpace[7090:248073] y1-----nan
2014-10-09 18:59:36.842 LiuDuSpace[7090:248073] y2-----nan


第一次和第二次不一样,第一次正确,第二次为nan类型了,

CGFloat y=0;这样后,两次打印都正确了

可能是不给它一个初始值,它就不一定给你什么东西。。。


http://en.wikipedia.org/wiki/Uninitialized_variable  可以看看这个

sh-3.2# gst-inspect-1.0 -b (gst-plugin-scanner:5027): GStreamer-WARNING **: 19:43:08.929: Failed to load plugin '/usr/lib64/gstreamer-1.0/libgstffmpeg.so': /usr/lib64/gstreamer-1.0/libgstffmpeg.so: undefined symbol: get_primary_transferfunc size of instance = 1624 size of class = 1848 size of basesrc = 648 size of basesrcclass = 824 (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.642: cannot register existing type 'GstTypeSMVideoEnc' (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_enum: assertion 'G_TYPE_IS_ENUM (enum_type)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: validate_pspec_to_install: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_ref_sink: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_unref: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: cannot register existing type 'GstTypeSMVideoEncDRM' (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_enum: assertion 'G_TYPE_IS_ENUM (enum_type)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: validate_pspec_to_install: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_ref_sink: assertion 'G_IS_PARAM_SPEC (pspec)' failed (gst-plugin-scanner:5027): GLib-GObject-CRITICAL **: 19:43:09.643: g_param_spec_unref: assertion 'G_IS_PARAM_SPEC (pspec)' failed Blacklisted files: libgstffmpeg.so Total count: 1 blacklisted file
最新发布
04-01
<think>好的,我现在需要帮助用户解决GStreamer插件加载失败的问题,以及处理相关的CRITICAL警告。首先,我需要理清用户的问题描述和已有的引用信息。 用户提到遇到了两个GStreamer的警告,一个是加载libgstchromaprint.so和libgstlibav.so时出现无法在静态TLS块中分配内存的问题,另一个是关于libgstffmpeg.so的未定义符号get_primary_transferfunc,以及GstTypeSMVideoEnc的CRITICAL警告。用户还提供了几个引用,涉及路径设置、插件搜索路径、安装runtime和development安装包的建议。 首先,分析第一个问题:静态TLS块无法分配内存。根据引用[1]中的错误信息,这通常是由于libgomp.so.1库在静态线程本地存储(TLS)中的问题。这可能是因为GStreamer插件需要动态加载的库使用了静态TLS,而系统在加载时无法分配足够的内存。解决方案可能涉及环境变量调整,如设置LD_PRELOAD或修改库的加载方式。 接下来是第二个问题:libgstffmpeg.so的未定义符号get_primary_transferfunc。这通常表明插件编译时使用的库版本与运行时链接的库版本不一致。可能用户安装的FFmpeg相关库版本不兼容,或者插件没有正确链接到所需的依赖项。此外,GstTypeSMVideoEnc的CRITICAL警告可能与此符号缺失有关,导致视频编码器状态机无法正确初始化。 现在结合用户提供的引用,引用[4]提到需要同时安装runtime和development安装包,这可能解决依赖问题。引用[2]和[3]涉及路径设置和插件搜索路径,可能用户的环境变量没有正确配置,导致插件无法找到依赖库。此外,用户可能没有正确安装所有必要的GStreamer插件和依赖项,比如libav或ffmpeg的插件。 可能的解决步骤包括: 1. 确认安装了两个安装包(runtime和development),如引用[4]所述。 2. 检查GStreamer的插件路径是否包含在环境变量中,如引用[3]提到的使用gst-inspect-1.0来验证插件路径。 3. 更新或重新安装FFmpeg相关的库,确保版本兼容。 4. 设置LD_PRELOAD环境变量预加载libgomp,解决静态TLS问题。 5. 检查符号冲突,可能需要重新编译插件或依赖库。 另外,用户提到的undefined symbol问题可能需要检查动态链接的库是否正确,使用ldd或nm工具查看libgstffmpeg.so的依赖项和符号是否存在。如果get_primary_transferfunc是某个新版本FFmpeg中的函数,而用户安装的是旧版本,就会导致符号未找到。此时需要更新FFmpeg或降级GStreamer插件版本以匹配。 关于GstTypeSMVideoEnc的警告,可能需要确认视频编码器的插件是否正确安装,比如x264或其他编码器支持库是否存在。 总结解决方案步骤: 1. 确保完整安装GStreamer和相关开发包。 2. 配置环境变量,正确设置插件路径。 3. 处理静态TLS错误,设置LD_PRELOAD。 4. 解决符号未定义问题,检查FFmpeg版本兼容性。 5. 重新安装或更新相关插件和依赖库。 在生成回答时,需要分步骤说明,确保用户能逐步操作,同时引用提供的参考资料中的正确部分,如引用[4]的安装建议,引用[3]的路径配置等。此外,可能需要指导用户如何验证每个步骤是否成功,例如运行gst-inspect-1.0来检查插件是否加载,或者使用ldd检查库依赖。</think>### GStreamer插件加载失败问题解决方案 #### 1. **静态TLS内存分配问题** **错误特征**: ```bash /lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block ``` **原因**:插件依赖的库(如`libgomp`)尝试在静态线程本地存储(TLS)中分配内存,但系统资源不足[^1]。 **解决方案**: - **方法1**:通过环境变量调整动态加载方式 ```bash export LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 ``` 强制预加载`libgomp`库,绕过静态TLS限制。 - **方法2**:重新编译依赖库 若问题持续,需重新编译相关库(如GStreamer插件或`libgomp`),启用动态TLS支持。 --- #### 2. **插件未找到或符号未定义问题** **错误特征**: ```bash undefined symbol: get_primary_transferfunc GstTypeSMVideoEnc CRITICAL warning ``` **原因**: - **符号缺失**:`libgstffmpeg.so`依赖的FFmpeg库版本与编译时不一致,导致运行时找不到符号。 - **插件路径错误**:GStreamer未正确识别插件安装路径。 **解决方案**: 1. **确认完整安装GStreamer组件** - 同时安装**Runtime Installer**和**Development Installer**[^4],确保插件和开发文件齐全。 - 默认安装路径应为: ```bash C:\gstreamer\1.0\mingw_x86_64\bin # Windows示例[^2] /usr/lib/aarch64-linux-gnu/gstreamer-1.0 # Linux示例 ``` 2. **配置插件搜索路径** - 添加环境变量`GST_PLUGIN_PATH`指向插件目录: ```bash export GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/usr/lib/aarch64-linux-gnu/gstreamer-1.0 ``` - 验证插件是否可被检测到: ```bash gst-inspect-1.0 libgstffmpeg # 检查FFmpeg插件状态[^3] ``` 3. **解决符号冲突或缺失** - **更新FFmpeg库**:确保安装的FFmpeg版本与GStreamer插件兼容。 ```bash sudo apt-get install ffmpeg libavcodec-dev # Ubuntu示例 ``` - **重新编译插件**:若符号仍缺失,需从源码重新编译GStreamer FFmpeg插件: ```bash git clone https://github.com/GStreamer/gst-plugins-bad cd gst-plugins-bad && meson build && ninja -C build ``` --- #### 3. **验证修复效果** - **检查插件加载**: ```bash gst-launch-1.0 --gst-plugin-path=/your/plugin/path audiotestsrc ! fakesink # 测试基础功能 ``` - **调试符号问题**: 使用`nm`工具检查动态库中的符号是否存在: ```bash nm -D /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstffmpeg.so | grep get_primary_transferfunc ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值