簡體   English   中英

從Xcode 9.4升級到Xcode 11並將Swift 3.0升級到Swift 4.2后在iOS應用中使用Realm時指針損壞

[英]Corrupt pointer when using Realm in iOS app after upgrading from Xcode 9.4 to Xcode 11 and Swift 3.0 to Swift 4.2

我有一個包含Swift和Objective-C代碼的混合應用程序。 在Xcode 9.4中運行代碼時,沒有問題。 升級到Xcode 11(以及請求升級到Swift 4.2)后,嘗試在Realm 0.93.2庫中引用已釋放實例時,該應用程序崩潰並顯示EXC_BAD_ACCESS錯誤。

以下是事件的順序:

  1. 啟動:

        @UIApplicationMain
    class VGPAppDelegate: UIResponder, UIApplicationDelegate, BITCrashManagerDelegate, BITHockeyManagerDelegate {

        var window: UIWindow?

        internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            //trigger the ui appearance
            VGPUIAppearance.triggerAppearance()

            //setup network monitoring
            TSReachabilityManager.default()
            //Update Realm Scheme
            VGPRealmMigrator.updateRealmSchema()

            setUpHockeyApp()
            setupAppearance()

            if didCrashInLastSessionOnStartup() {
                // Delay launch for sending the crash report
            } else {
                setupApplication()
            }

            return true
        }

  1. 調用VGPRealmMigrator.updateRealmSchema()之后

    for (Class cls in s_localNameToClass.allValues) {
    RLMObjectSchema *schema = [RLMObjectSchema 
    schemaForObjectClass:cls];
    [schemaArray addObject:schema];

            // override sharedSchema classs methods for performance
            RLMReplaceSharedSchemaMethod(cls, schema);

            // set standalone class on shared shema for standalone object creation
            schema.standaloneClass = RLMStandaloneAccessorClassForObjectClass(schema.objectClass, schema);
        }
        free(classes);

注意:架構在此處> Realm> RLMSchema.mm> Intitialise中具有有效的指針

  1. 現在在Realm> RLMAccessor.mm中

    static Class RLMCreateAccessorClass(Class objectClass,
                                        RLMObjectSchema *schema,
                                        NSString *accessorClassPrefix,
                                        IMP (*getterGetter)(RLMProperty *, RLMAccessorCode, NSString *),
                                        IMP (*setterGetter)(RLMProperty *, RLMAccessorCode)) {
        // throw if no schema, prefix, or object class
        if (!objectClass || !schema || !accessorClassPrefix) {
            @throw RLMException(@"Missing arguments");
        }
        if (!RLMIsKindOfClass(objectClass, RLMObjectBase.class)) {
            @throw RLMException(@"objectClass must derive from RLMObject or Object");
        }

        // create and register proxy class which derives from object class
        NSString *accessorClassName = [accessorClassPrefix stringByAppendingString:schema.className];
        Class accClass = objc_getClass(accessorClassName.UTF8String);
        if (!accClass) {
            accClass = objc_allocateClassPair(objectClass, accessorClassName.UTF8String, 0);
            objc_registerClassPair(accClass);
        }


應用程序在包含引用schema.className的語句中崩潰。 架構在這里具有空指針。 僵屍顯示“郵件已發送到已釋放實例”。

我使用的是Realm的較舊版本(0.93.2)。 通過以下方式解決了該問題:

  1. pod安裝--repo-update
  2. pod install(給我的最新版本是3.17.3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM