iOS   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Xcode 8升级后,iOS10中的应用程序崩溃,返回了malloc错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我最近升级到iOS10和 Xcode 8,之后一些以前正在运行的代码现在不再有效了.当代码运行时,应用程序崩溃并在控制台中显示以下错误消息: malloc:*对象0x1700bea80的错误:未分配被释放的指针 *在malloc_error_break中设置断点以进行调试 我已经做了一些测试,并将错误缩小到以下代码中的’createNativeAd’函数. 任何人都可以看到为什么会抛出这个错误?
我最近升级到iOS10和 Xcode 8,之后一些以前正在运行的代码现在不再有效了.当代码运行时,应用程序崩溃并在控制台中显示以下错误消息:

@H_518_19@malloc:*对象0x1700bea80的错误未分配被释放的指针
*在malloc_error_break中设置断点以进行调试

我已经做了一些测试,并将错误缩小到以下代码中的’createNativeAd’函数.

任何人都可以看到为什么会抛出这个错误

//
//  FacebookAdPlugin.m
//  TestAdMobCombo
//
//  Created by Xie Liming on 14-11-8.
//
//

#import <FBAudienceNetwork/FBAudienceNetwork.h>
#import "UITapGestureRecognizer+Spec.h"
#import "FacebookAdPlugin.h"

#define test_BAnnER_ID           @"726719434140206_777151452430337"
#define test_INERSTITIAL_ID      @"726719434140206_777151589096990"
#define test_NATIVE_ID           @"726719434140206_777151705763645"

#define OPT_DEVICE_HASH          @"deviceHash"

@interface FacebookAdPlugin()<FBAdViewDelegate,FBInterstitialAdDelegate,FBNativeAdDelegate,UIGestureRecognizerDelegate>

@property (assign) FBAdSize adSize;
@property (nonatomic,retain) NSMutableDictionary* nativeads;

- (void) __removeNativeAd:(NSString*)adId;
- (void) fireNativeAdLoadEvent:(FBNativeAd*)nativeAd;

@end


// ------------------------------------------------------------------

@interface UITrackingView : UIView

@end

@implementation UITrackingView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // Always ignore the touch event,so that we can scroll the webview beneath.
    // We will inovke GestureRecognizer callBACk ourselves.
    return nil;
}
@end

// ------------------------------------------------------------------

@interface FlexNativeAd : NSObject

@property (nonatomic,retain) NSString* adId;
@property (nonatomic,retain) FBNativeAd* ad;
@property (nonatomic,retain) UITrackingView* view;
@property (assign) int x,y,w,h;

- (FlexNativeAd*) init;

@end

@implementation FlexNativeAd

- (FlexNativeAd*) init
{
    self.adId = NULL;
    self.ad = NULL;
    self.view = NULL;
    self.x = 0;
    self.y = 0;
    self.w = 0;
    self.h = 0;

    return self;
}

@end

// ------------------------------------------------------------------

@implementation FacebookAdPlugin

- (void)pluginInitialize
{
    [super pluginInitialize];

    self.adSize = [self __AdSizeFromString:@"smaRT_BAnnER"];
    self.nativeads = [[NSMutableDictionary alloc] init];
}

- (NSString*) __getProductShortName{
    return @"FacebookAds";
}

- (NSString*) __getTESTBAnnerId;
{
    return test_BAnnER_ID;
}

- (NSString*) __getTesTinterstitialId
{
    return test_INERSTITIAL_ID;
}

- (FBAdSizE) __AdSizeFromString:(NSString*)str
{
    FBAdSize sz;
    if ([str isEqualToString:@"BAnnER"]) {
        sz = kFBAdSize320x50;
    // other size not supported by facebook audience network: FULL_BAnnER,MEDIUM_RECTANGLE,LEADERBOARD,SKYSCRAPER
    //} else if ([str isEqualToString:@"smaRT_BAnnER"]) {
    } else {
        BOOL isIPAD = ([[UIDevice currentDevice] userInterfaceI@L_687_11@m] == UIUserInterfaceI@L_687_11@mPad);
        sz = isIPAD ? kFBAdSizeHeight90BAnner : kFBAdSizeHeight50BAnner;
    }

    return sz;
}

- (void) parSEOptions:(NSDictionary *)options
{
    [super parSEOptions:options];

    NSString* str = [options objectForKey:OPT_AD_SIZE];
    if(str) {
        self.adSize = [self __AdSizeFromString:str];
    }

    if(self.isTesTing) {
        self.testTraffic = true;

        str = [options objectForKey:OPT_DEVICE_HASH];
        if(str && [str length]>0) {
            NSLog(@"set device hash: %@",str);
            [FBAdSetTings addTestDevice:str];
        }

        // TODO: add device hash,but kNow how to get the FB hash id on ios ...
    }
}


- (UIView*) __createAdView:(NSString*)adId
{
    FBAdView* ad = [[FBAdView alloc] initWithPlacementID:adId
                                                  adSize:self.adSize
                                      rootViewController:[self getViewController]];
    ad.delegate= self;

    if(self.adSize.size.height == 50 || self.adSize.size.height == 90) {
        ad.autoresizingMask =
        UIViewAutoresizingFlexibleRightMargin |
        UIViewAutoresizingFlexibleLeftMargin|
        UIViewAutoresizingFlexibleWidth |
        UIViewAutoresizingFlexibleTopMargin;
    }

    return ad;
}

- (int) __getAdViewWidth:(UIView*)view
{
    return view.frame.size.width;
}

- (int) __getAdViewHeight:(UIView*)view
{
    return view.frame.size.height;
}

- (void) __loadAdView:(UIView*)view
{
    if([view isKindOfClass:[FBAdView class]]) {
        FBAdView* ad = (FBAdView*) view;
        [ad loadAd];
    }
}

- (void) __pauseAdView:(UIView*)view
{
    if([view isKindOfClass:[FBAdView class]]) {
        //FBAdView* ad = (FBAdView*) view;
        // [ad pause];
    }
}

- (void) __resumeAdView:(UIView*)view
{
    if([view isKindOfClass:[FBAdView class]]) {
        //FBAdView* ad = (FBAdView*) view;
        // [ad resume];
    }
}

- (void) __destroyAdView:(UIView*)view
{
    if([view isKindOfClass:[FBAdView class]]) {
        FBAdView* ad = (FBAdView*) view;
        ad.delegate = nil;
    }
}

- (NSObject*) __createInterstitial:(NSString*)adId
{
    FBInterstitialAd* ad = [[FBInterstitialAd alloc] initWithPlacementID:adId];
    ad.delegate = self;

    return ad;
}

- (void) __loadInterstitial:(NSObject*)interstitial
{
    if([interstitial isKindOfClass:[FBInterstitialAd class]]) {
        FBInterstitialAd* ad = (FBInterstitialAd*) interstitial;
        [ad loadAd];
    }
}

- (void) __showInterstitial:(NSObject*)interstitial
{
    if([interstitial isKindOfClass:[FBInterstitialAd class]]) {
        FBInterstitialAd* ad = (FBInterstitialAd*) interstitial;
        if(ad && ad.isAdValid) {
            [ad showAdFromRootViewController:[self getViewController]];
        }
    }
}

- (void) __destroyInterstitial:(NSObject*)interstitial
{
    if([interstitial isKindOfClass:[FBInterstitialAd class]]) {
        FBInterstitialAd* ad = (FBInterstitialAd*) interstitial;
        ad.delegate = nil;
    }
}

- (void)handleTapOnWebView:(UITapGestureRecognizer *)sender
{
    //NSLog(@"handleTapOnWeb");

    for(id key in self.nativeads) {
        FlexNativeAd* unit = (FlexNativeAd*) [self.nativeads objectForKey:key];
        CGPoint point = [sender LOCATIOnInView:unit.view];
        if([unit.view poinTinside:point withEvent:nil]) {
            NSLog(@"Native Ad view area tapped");

            NSArray* handlers = [unit.view gestureRecognizers];
            for(id handler in handlers) {
                if([handler isKindOfClass:[UITapGestureRecognizer class]]) {
                    UITapGestureRecognizer* tapHandler = (UITapGestureRecognizer*) handler;

                    // Here we call the injected method,defined in "UITapGestureRecognizer+Spec.m"
                    if([tapHandler respondsToSELEctor:@SELEctor(performTapWithView:andPoint:)]) {
                        [tapHandler performTapWithView:unit.view andPoint:point];
                    }
                }
            }
        }
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

- (void)createNativeAd:(CDVInvokedUrlCommand *)command
{
    NSLog(@"createNativeAd");

    if([command.arguments count] >= 1) {
        NSString* adId = [command argumentATindex:0];

        if(self.testTraffiC) adId = test_INERSTITIAL_ID;

        FlexNativeAd* unit = [self.nativeads objectForKey:adId];
        if(unit) {
            if(unit.adId) {
                [self __removeNativeAd:unit.adId];
            }
        }

        unit = [[FlexNativeAd alloc] init];
        unit.adId = adId;

        CGRect adRect = {{0,0},{0,0}};
        unit.view = [[UITrackingView alloc] initWithFrame:adRect];
        [[self getView] addSubview:unit.view];

        // add tap handler to handle tap on webview
        UITapGestureRecognizer *webViewTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@SELEctor(handleTapOnWebView:)];
        webViewTapped.numberOfTapsrequired = 1;
        webViewTapped.delegate = self;
        [[self getView] addGestureRecognizer:webViewTapped];

        if(self.isTesTing) {
            [unit.view setBACkgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.2f]];
        }

        unit.ad = [[FBNativeAd alloc] initWithPlacementID:adId];
        unit.ad.delegate = self;

        [self.nativeads setObject:unit forKey:adId];

        [unit.ad loadAd];

        [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK] to:command.callBACkId];
    } else {
        [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid arguments"] to:command.callBACkId];
    }
}

- (void) __removeNativeAd:(NSString*)adId
{
    FlexNativeAd* unit = [self.nativeads objectForKey:adId];
    if(unit) {
        [self.nativeads removeObjectForKey:adId];

        if(unit.view) {
            CGRect adFrame = {{0,0}};
            unit.view.frame = adFrame;
            [unit.view removeFromSuperview];
        }

        if(unit.ad) {
            [unit.ad unregisterView];
        }
    }
}

- (void)removeNativeAd:(CDVInvokedUrlCommand *)command
{
    NSLog(@"removeNativeAd");

    if([command.arguments count] >= 1) {
        NSString* adId = [command argumentATindex:0];
        [self __removeNativeAd:adId];

        [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK] to:command.callBACkId];
    } else {
        [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid arguments"] to:command.callBACkId];
    }
}

- (void)setNativeAdClickArea:(CDVInvokedUrlCommand *)command
{
    NSLog(@"setNativeAdClickArea");

    if([command.arguments count] >= 5) {
        NSString* adId = [command argumentATindex:0];

        FlexNativeAd* unit = [self.nativeads objectForKey:adId];
        if(unit && unit.view) {
            int x = [[command argumentATindex:1 withDefault:@"0"] intValue];
            int y = [[command argumentATindex:2 withDefault:@"0"] intValue];
            int w = [[command argumentATindex:3 withDefault:@"0"] intValue];
            int h = [[command argumentATindex:4 withDefault:@"0"] intValue];

            CGRect adRect = {{x,y},{w,h}};
            unit.view.frame = adRect;

            [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK] to:command.callBACkId];

        } else {
            [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"native ad not exists"] to:command.callBACkId];
        }

    } else {
        [self sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid arguments"] to:command.callBACkId];
    }
}

#pragma mark FBAdViewDelegate implementation

/**
 * document.addEventListener('onAdLoaded',function(data));
 * document.addEventListener('onAdFailLoad',function(data));
 * document.addEventListener('onAdPresent',function(data));
 * document.addEventListener('onAdDismiss',function(data));
 * document.addEventListener('onAdLeaveApp',function(data));
 */
- (void)adViewDidClick:(FBAdView *)adView
{
    [self fireAdEvent:EVENT_AD_LEAVEAPP withType:ADTYPE_BAnnER];
}

- (void)adViewDidFinishHandlingClick:(FBAdView *)adView
{
    [self fireAdEvent:EVENT_AD_DISMISS withType:ADTYPE_BAnnER];
}

- (void)adViewDidLoad:(FBAdView *)adView
{
    if((! self.bAnnerVisiblE) && self.autoShowBAnner) {
        dispatch_async(dispatch_get_main_queue(),^{
            [self __showBAnner:self.adPosition atX:self.posx atY:self.posy];
        });
    }

    [self fireEvent:[self __getProductShortName] event:@"onBAnnerReceive" withData:NULL];

    [self fireAdEvent:EVENT_AD_LOADED withType:ADTYPE_BAnnER];
}

- (void)adView:(FBAdView *)adView didFailWithError:(NSError *)error
{
    [self fireAdErrorEvent:EVENT_AD_FAILLOAD withCode:(int)error.code withMsg:[error localizedDescription] withType:ADTYPE_BAnnER];
}

- (void)adViewWillLogImpression:(FBAdView *)adView
{
    [self fireAdEvent:EVENT_AD_PRESENT withType:ADTYPE_BAnnER];
}

///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - FBInterstitialAdDelegate

/**
 * document.addEventListener('onAdLoaded',function(data));
 */
- (void)interstitialAdDidLoad:(FBInterstitialAd *)interstitialAd
{
    if (self.interstitial && self.autoShowInterstitial) {
        dispatch_async(dispatch_get_main_queue(),^{
            [self __showInterstitial:self.interstitial];
        });
    }

    [self fireAdEvent:EVENT_AD_LOADED withType:ADTYPE_INTERSTITIAL];
}

- (void)interstitialAd:(FBInterstitialAd *)interstitialAd didFailWithError:(NSError *)error
{
    [self fireAdErrorEvent:EVENT_AD_FAILLOAD withCode:(int)error.code withMsg:[error localizedDescription] withType:ADTYPE_INTERSTITIAL];
}

- (void)interstitialAdDidClick:(FBInterstitialAd *)interstitialAd
{
    [self fireAdEvent:EVENT_AD_LEAVEAPP withType:ADTYPE_INTERSTITIAL];
}

- (void)interstitialAdDidClose:(FBInterstitialAd *)interstitialAd
{
    [self fireAdEvent:EVENT_AD_DISMISS withType:ADTYPE_INTERSTITIAL];

    if(self.interstitial) {
        [self __destroyInterstitial:self.interstitial];
        self.interstitial = nil;
    }
}

- (void)interstitialAdWillClose:(FBInterstitialAd *)interstitialAd
{
    [self fireAdEvent:EVENT_AD_WILLDISMISS withType:ADTYPE_INTERSTITIAL];
}

- (void)interstitialAdWillLogImpression:(FBInterstitialAd *)interstitialAd
{
    [self fireAdEvent:EVENT_AD_WILLPRESENT withType:ADTYPE_INTERSTITIAL];
}

/**
 * document.addEventListener('onAdLoaded',function(data));
 */
- (void)nativeAd:(FBNativeAd *)nativeAd didFailWithError:(NSError *)error
{
    [self fireAdErrorEvent:EVENT_AD_FAILLOAD withCode:(int)error.code withMsg:[error localizedDescription] withType:ADTYPE_NATIVE];
}

- (void)nativeAdDidClick:(FBNativeAd *)nativeAd
{
    [self fireAdEvent:EVENT_AD_LEAVEAPP withType:ADTYPE_NATIVE];
}

- (void)nativeAdDidFinishHandlingClick:(FBNativeAd *)nativeAd
{
    [self fireAdEvent:EVENT_AD_DISMISS withType:ADTYPE_NATIVE];
}

- (void)nativeAdDidLoad:(FBNativeAd *)nativeAd
{
    [self fireNativeAdLoadEvent:nativeAd];
}

- (void) fireNativeAdLoadEvent:(FBNativeAd*)nativeAd
{
    [self.nativeads enumerateKeysAndObjectsUsingBlock:^(id key,id obj,BOOL *stop) {
        NSString* adId = (NSString*) key;
        FlexNativeAd* unit = (FlexNativeAd*) obj;
        if(unit && unit.ad == nativeAd) {
            NSString *titleForAd = nativeAd.title;
            NSString *bodyTextForAd = nativeAd.body;
            FBAdImage *coverImage = nativeAd.coverImage;
            FBAdImage *iconForAd = nativeAd.icon;
            NSString *socialContextForAd = nativeAd.socialContext;
            struct FBAdStarrating appratingForAd = nativeAd.starrating;
            NSString *titleForAdButton = nativeAd.callToAction;

            NSMutableDictionary* coverInfo = [[NSMutableDictionary alloc] init];
            [coverInfo SETVALue:[coverImage.url absoluteString] forKey:@"url"];
            [coverInfo SETVALue:[NSnumber numberWithInt:coverImage.width] forKey:@"width"];
            [coverInfo SETVALue:[NSnumber numberWithInt:coverImage.height] forKey:@"height"];

            NSMutableDictionary* iconInfo = [[NSMutableDictionary alloc] init];
            [iconInfo SETVALue:[iconForAd.url absoluteString] forKey:@"url"];
            [iconInfo SETVALue:[NSnumber numberWithInt:iconForAd.width] forKey:@"width"];
            [iconInfo SETVALue:[NSnumber numberWithInt:iconForAd.height] forKey:@"height"];

            NSMutableDictionary* adRes = [[NSMutableDictionary alloc] init];
            [adRes SETVALue:coverInfo forKey:@"coverImage"];
            [adRes SETVALue:iconInfo forKey:@"icon"];
            [adRes SETVALue@R_56_6964@ForAd forKey:@"title"];
            [adRes SETVALue:bodyTextForAd forKey:@"body"];
            [adRes SETVALue:socialContextForAd forKey:@"socialContext"];
            [adRes SETVALue:[NSnumber numberWithFloat:appratingForAd.value] forKey:@"rating"];
            [adRes SETVALue:[NSnumber numberWithInt:appratingForAd.scale] forKey:@"ratingScale"];
            [adRes SETVALue@R_56_6964@ForAdButton forKey:@"buttontext"];

            NSMutableDictionary* json = [[NSMutableDictionary alloc] init];
            [json SETVALue:[self __getProductShortName] forKey:@"adNetwork"];
            [json SETVALue:EVENT_AD_LOADED forKey:@"adEvent"];
            [json SETVALue:ADTYPE_NATIVE forKey:@"adType"];
            [json SETVALue:adId forKey:@"adId"];
            [json SETVALue:adRes forKey:@"adRes"];

            NSError * err;
            NSData * jsonData = [NSJSONserialization dataWithJSONObject:json options:0 error:&err];
            NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

            [unit.ad registerViewForInteraction:unit.view withViewController:[self getViewController]];

            [self fireEvent:[self __getProductShortName] event:EVENT_AD_LOADED withData:jsonStr];

            *stop = YES;
        }
    }];
}

- (void)nativeAdWillLogImpression:(FBNativeAd *)nativeAd
{
    [self fireAdEvent:EVENT_AD_PRESENT withType:ADTYPE_NATIVE];
}

@end

完整的源代码可以在https://github.com/floatinghotpot/cordova-plugin-facebookads找到

解决方法

阅读此答案 https://stackoverflow.com/a/40068196/935070

@H_518_19@mac的Safari的@L_696_29@网络检查器正在崩溃横幅

只是禁用@L_696_29@Web检查

Safari>开发>设备>@L_696_29@显示JSContext的Web检查器

大佬总结

以上是大佬教程为你收集整理的在Xcode 8升级后,iOS10中的应用程序崩溃,返回了malloc错误全部内容,希望文章能够帮你解决在Xcode 8升级后,iOS10中的应用程序崩溃,返回了malloc错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。