「OC」源码学习——objc_class的bits成员探究

「OC」源码学习——objc_class的bits成员探究

类模版

@interface GGObject : NSObject
{
   
   
    int _sum;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *hobby;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) double height;
@property (nonatomic, assign) short number;
- (void)speak;
- (void)sayHello;
+ (void)walk;
@end

@implementation GGObject

- (void)speak {
   
   
    NSLog(@"%s", __func__);
}
+ (void)walk {
   
   
    NSLog(@"%s", __func__);
}

-(void) sayHello {
   
   
    NSLog(@"%s", __func__);
}

@end

objc_class的成员变量

在全局搜索搜索objc_class 的内容,我们看到内容如下

image-20250427192832522

类本身自带的isa指针为八字节;其中superclass为class类型本质为isa指针,大小也为八字节;cache_t结构体的内容得在lldb之中进行分析,查看cache_t的结构体数据,使用p sizeof(cache_t)可以看到,cache_t的内存为16字节,结合我们前面所计算的,那么我们不难得出。只要我们在objc_class的首地址加上32字节就可以得到bits之中的信息

image-20250427194349585

如何获取bits

既然已经知道平移32位就能获取bits的相关信息,那在lldb里面就不难操作了,我们进入class_data_bits_t的声明,看到data()方法

class_rw_t* data() const {
   
   
        return (class_rw_t *)(bits & FAST_DATA_MASK);
    }

大致意思是,将bit的内容转化为class_rw_t的类型输出

xcode手动导入包报错:Undefined symbol: _APMAnalyticsConfiguration Undefined symbol: _APMAppMeasurementOriginFirebase Undefined symbol: _APMConsentSettings3P Undefined symbol: _APMFormattedEventName Undefined symbol: _APMFormattedUserPropertyName Undefined symbol: _APMIsAnalyticsCollectionDeactivated Undefined symbol: _APMIsAnalyticsCollectionEnabled Undefined symbol: _APMIsValidTransactionDeviceVerification Undefined symbol: _APMMonitorLogTagOptionKey Undefined symbol: _APMUserDataFieldEmailAddress Undefined symbol: _APMUserDataFieldHashedEmailAddress Undefined symbol: _APMUserDataFieldHashedPhoneNumber Undefined symbol: _APMUserDataFieldPhoneNumber Undefined symbol: _OBJC_CLASS_$_APMAdExposureReporter Undefined symbol: _OBJC_CLASS_$_APMAnalytics Undefined symbol: _OBJC_CLASS_$_APMConditionalUserProperty Undefined symbol: _OBJC_CLASS_$_APMConditionalUserPropertyController Undefined symbol: _OBJC_CLASS_$_APMEvent Undefined symbol: _OBJC_CLASS_$_APMIdentifiers Undefined symbol: _OBJC_CLASS_$_APMIdentity Undefined symbol: _OBJC_CLASS_$_APMMeasurement Undefined symbol: _OBJC_CLASS_$_APMScreenViewReporter Undefined symbol: _OBJC_CLASS_$_APMUserAttribute Undefined symbol: _OBJC_CLASS_$_APMValue Undefined symbol: _OBJC_CLASS_$_MTGAdChoicesView Undefined symbol: _OBJC_CLASS_$_MTGBannerAdView Undefined symbol: _OBJC_CLASS_$_MTGBidNativeAdManager Undefined symbol: _OBJC_CLASS_$_MTGBidRewardAdManager Undefined symbol: _OBJC_CLASS_$_MTGBiddingSDK Undefined symbol: _OBJC_CLASS_$_MTGMediaView Undefined symbol: _OBJC_CLASS_$_MTGNewInterstitialAdManager Undefined symbol: _OBJC_CLASS_$_MTGNewInterstitialBidAdManager Undefined symbol: _OBJC_CLASS_$_MTGRewardAdManager Undefined symbol: _OBJC_CLASS_$_MTGSDK Undefined symbol: _OBJC_CLASS_$_MTGSplashAD Undefined symbol: _OBJC_METACLASS_$_APMAdExposureReporter Undefined symbol: _OBJC_METACLASS_$_APMConditionalUserProperty Undefined symbol: _OBJC_METACLASS_$_APMConditionalUserPropertyController Undefined symbol: _OBJC_METACLASS_$_APMEvent Undefined symbol: _OBJC_METACLASS_$_APMIdentifiers Undefined symbol: _OBJC_METACLASS_$_APMMeasurement Undefined symbol: _OBJC_METACLASS_$_APMScreenViewReporter Undefined symbol: _OBJC_METACLASS_$_APMUserAttribute Undefined symbol: _OBJC_METACLASS_$_APMValue
07-27
在Xcode手动导入SDK后,若出现`Undefined symbol: _APMAnalyticsConfiguration`和`_OBJC_CLASS_$_MTGSDK`等错误,通常意味着链接器无法找到某些类或符号的定义。这类问题通常出现在接入第三方SDK、静态库或进行多项目联编时,特别是在架构适配、依赖管理或构建配置设置不当的情况下。 ### 检查依赖库是否正确引入 若使用的是手动导入方式(非CocoaPods),需要确保APM和MTG相关的`.a`、`.framework`或`.xcframework`文件已正确添加到项目中,并在`Build Phases > Link Binary With Libraries`中显式链接这些库。遗漏或路径错误会导致符号未定义错误[^1]。 ### 构建配置与架构设置 确保构建配置(Build Configuration)中的`Other Linker Flags`包含必要的标志,如`-ObjC`和`-framework "APM"`或`-framework "MTGSDK"`。此外,检查`Build Settings > Architectures`是否与SDK支持的架构一致。若APM或MTG SDK不支持`arm64`或模拟器架构(如`x86_64`),应在`Excluded Architectures`中排除。 ### Bitcode设置 部分第三方SDK可能不支持Bitcode。若项目启用了Bitcode(默认为`YES`),而APM或MTG SDK未提供Bitcode支持,则会导致链接失败。此时应将`Build Settings > Enable Bitcode`设置为`NO`,尤其是Archive构建配置中。 ### 静态库依赖问题 若APM或MTG SDK是静态库形式提供,还需确保其依赖的系统框架(如`CoreTelephony`、`SystemConfiguration`等)也被正确链接。否则即使主库被正确引入,其内部依赖的符号仍然可能报错[^1]。 ### 桥接与模块设置(适用于Swift项目) 若项目使用Swift语言,并且APM或MTG SDK是Objective-C编写的,需确保在桥接头文件(Bridging Header)中正确导入SDK头文件。此外,检查主项目与Pod项目的`Defines Module`和`Product Module Name`设置是否一致,以确保Swift能够识别Objective-C模块[^1]。 ### 示例:Other Linker Flags设置 ```bash OTHER_LDFLAGS = ( "-framework \"APM\"", "-framework \"MTGSDK\"", "-ObjC", ); ``` ### 示例:排除不支持的架构 在`Build Settings > Excluded Architectures`中添加: ``` x86_64 ``` 适用于Release和Archive构建配置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值