SpriteKit Obj C游戏在iOS 9中崩溃

时间:2016-02-09 19:30:10

标签: ios objective-c sprite-kit exc-bad-access

我有一个使用精灵套件和Objective-C的游戏,最初是使用Xcode 6和iOS 7开发的,但它现在在iOS 9设备上崩溃了。

当用户从一个级别进展到另一个级别并且向场景添加新的水平滚动背景(SKNode)时,会发生崩溃。

例外:

  

线程1 EXC_BAD_ACCESS(代码= 1,地址= 0x0)

更改级别时将水平滚动背景添加到场景:

// Array of planets to scroll
NSArray *parallaxBackgroundNames = @[@"bg_galaxy.png", @"bg_planetsunrise.png",
                                     @"bg_spacialanomaly.png", @"bg_spacialanomaly2.png"];
CGSize planetSizes = CGSizeMake(200.0, 200.0);


// Initialize new back round scrolling node and ad to scene 
_parallaxNodeBackgrounds = [[FMMParallaxNode alloc] initWithBackgrounds:parallaxBackgroundNames
                                                                   size:planetSizes
                                                   pointsPerSecondSpeed:10.0];

// Position in center of screen
_parallaxNodeBackgrounds.position = CGPointMake(self.size.width/2.0, self.size.height/2.0);

// Method to randomly place planets as offsets to center of screen
[_parallaxNodeBackgrounds randomizeNodesPositions];

// EXCEPTION THROWN HERE when adding it to the layer
[self addChild:_parallaxNodeBackgrounds];

_parallaxNodeBackgounds SKSNode FMMParallaxNode- (instancetype)initWithBackgrounds:(NSArray *)files size:(CGSize)size pointsPerSecondSpeed:(float)pointsPerSecondSpeed { if (self = [super init]) { _pointsPerSecondSpeed = pointsPerSecondSpeed; _numberOfImagesForBackground = [files count]; _backgrounds = [NSMutableArray arrayWithCapacity:_numberOfImagesForBackground]; _randomizeDuringRollover = NO; [files enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { SKSpriteNode *node = [SKSpriteNode spriteNodeWithImageNamed:obj]; node.size = size; node.anchorPoint = CGPointZero; node.position = CGPointMake(size.width * idx, 0.0); node.name = @"background"; //NSLog(@"node.position = x=%f,y=%f",node.position.x,node.position.y); [_backgrounds addObject:node]; [self addChild:node]; }]; } return self; } 实例初始化为:

<context:property-placeholder location="classpath:application.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="${dataSource.url}"/>
    <property name="user" value="${dataSource.username}"/>
    <property name="password" value="${dataSource.password}"/>

    <!-- these are C3P0 properties -->
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
    <property name="acquireIncrement" value="1" />
    <property name="maxStatements" value="50" />
    <property name="idleConnectionTestPeriod" value="3000" />
    <property name="loginTimeout" value="300" />
    <property name="unreturnedConnectionTimeout" value="30"/>
    <property name="debugUnreturnedConnectionStackTraces" value="true"/>
</bean>

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
    <property name="generateDdl" value="true"/>
    <property name="database" value="MYSQL"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <!-- spring based scanning for entity classes-->
    <property name="packagesToScan" value="dk.eazyit.halalguide.domain"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.connection.release_mode">after_transaction</prop>
            <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<aws-context:context-credentials>
    <aws-context:simple-credentials access-key="${awsAccessKey}" secret-key="${awsSecretKey}"/>
</aws-context:context-credentials>

<aws-context:context-region region="eu-west-1"/>

<aws-context:context-resource-loader/>

<bean id="awsTransferService" class="dk.eazyit.halalguide.service.AwsTransferService"/>

<aws-context:context-resource-loader task-executor="executor"/>

<task:executor id="executor" pool-size="10" queue-capacity="0" rejection-policy="CALLER_RUNS"/>

有关此崩溃发生原因的任何输入都表示赞赏。

编辑: 我对这个异常的理解是,如果指针指向已经解除分配或指针已损坏的内存,则抛出它。

当我在Xcode中构建和分析时,没有与此对象相关的错误,我也在本地创建了一个新指针(原始指针是一个实例var),但仍然得到相同的错误。

1 个答案:

答案 0 :(得分:1)

做一个像这样的弱引用:

- (instancetype)initWithBackgrounds:(NSArray *)files size:(CGSize)size pointsPerSecondSpeed:(float)pointsPerSecondSpeed
{
    if (self = [super init])
    { 
        __weak FMMParallaxNode *weakSelf = self;
        _pointsPerSecondSpeed = pointsPerSecondSpeed;
        _numberOfImagesForBackground = [files count];
        _backgrounds = [NSMutableArray arrayWithCapacity:_numberOfImagesForBackground];
        _randomizeDuringRollover = NO;
        [files enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            SKSpriteNode *node = [SKSpriteNode spriteNodeWithImageNamed:obj];
            node.size = size;
            node.anchorPoint = CGPointZero;
            node.position = CGPointMake(size.width * idx, 0.0);
            node.name = @"background";
            //NSLog(@"node.position = x=%f,y=%f",node.position.x,node.position.y);
            [_backgrounds addObject:node];
            [weakSelf addChild:node];
        }];
    }
    return self;
}