الكود الخاص بي إما يتسرب ويعمل، أو لا يتسرب ويتعطل.لا يبدو أن هذا يمثل مشكلة في الإصدار التلقائي

StackOverflow https://stackoverflow.com/questions/1423698

سؤال

بعد أن انتهيت من برمجة الأجزاء الصعبة من لعبتي، وجدت بعض الأخطاء في إدارة الذاكرة.

الكائنات هي NSMutableArray تحتوي على فئة مخصصة.

- (void) spawnObjects
{   
    for (int index = 0; index < INITIAL_OBJECTS; index++)
    {
        [objects addObject:[[[MatchObject alloc] initWithImageNameID:(index % 3)] autorelease]];
        [[objects objectAtIndex:index] setPosition:[GameLayer randomPoint]];
    }

    ...
}

أستخدم هذه الوظيفة لاحقًا.

- (void) checkAllSprites
{

    NSMutableArray *spritesToDelete = [NSMutableArray array];
    for (int index = 0; index < [points count] - 1; index ++)
    {
        for (MatchObject *planetLike in objects)
        {
            CGPoint point1 = [[points objectAtIndex:index] CGPointValue];
            CGPoint point2 = [[points objectAtIndex:index+1] CGPointValue];
            if ([GameLayer lineIntersectsCircle:point1 :point2 :[planetLike position] :16.0f])
            {

                ParticleSystem *planetDeath = [ParticlePlanetDeath node];
                planetDeath.texture = [[TextureMgr sharedTextureMgr] addImage:@"fire.pvr"];
                planetDeath.position = [planetLike position];
                [self addChild:planetDeath z:0 tag:2];

                [spritesToDelete addObject:planetLike];

                [self removeChild:planetLike cleanup:YES];

            }

        }
    }
    [objects removeObjectsInArray:spritesToDelete];
    [spritesToDelete removeAllObjects];

}

إذا لم أقم بالتحرير التلقائي في الوظيفة الأولى، فسيعمل التطبيق بشكل جيد.إذا قمت بذلك، فسأحاول الوصول إلى كائن غير مخصص ([موضع MatchObject]).

ما هو الخطأ؟!

هل كانت مفيدة؟

المحلول

وهذا يبدو وكأنه كنت الرجوع ذاكرة محررة. عندما كنت في الواقع تحرير الذاكرة، فإنه تعطل لreferencs البرنامج الافراج عن الذاكرة. عندما كنت لا الإفراج عنها باستخدام autorelease، وأنها تعمل يزال خارج لأنه حتى وإن هناك ذاكرة تسرب النظام لا تلاحظ ذلك لأنه منذ لم يتم تحرير الكائن في الواقع حتى الإشارة إلى أنه لا يسبب مشكلة.

وهكذا، والخروج من العدسة المكبرة وتبدو على التعليمات البرمجية الخاصة بك مرة أخرى، والبدء في استخدام المصحح ... المتعة:)

نصائح أخرى

مجرد تخمين جامح:

أفترض addChild هو الاحتفاظ بالكائن و com.removeChild هو الافراج عن الكائن.

ولكن ماذا يحدث عندما com.removeChild لا يجد الكائن (أيإذا لم يكن طفلا)؟هل يطلق الكائن أيضًا في هذه الحالة؟(وهو ما لا ينبغي أن يفعل)

وأي فرصة أن كنت تفعل شيئا في طريقة "removeChild" الذي ينتهي الإفراج عن الكائن؟ هناك doen't يبدو أن أي شيء خطأ في التعليمات البرمجية التي قمت بنشرها ...

ويجب autorelease في الوظيفة الأولى، لأنها هي وظيفة مثل غير الحرف الأول، وكنت استدعاء الحرف الأول.

وفي نهاية الدالة الأولى، الكائن لا يزال ساري المفعول، وبما انك إضافته إلى مجموعة التي تسببت في الاحتفاظ بها.

وبين الوظيفة الأولى يطلق عليها والثانية يطلق عليها، شخص ما هو الافراج عن الكائن، وهذا هو السبب الوصول إلى الكائن تحطمها.

ووضع نقطة توقف في الوظيفة الأولى، dealloc الكائن والوظيفة الثانية، لمعرفة من هو إطلاقه قبل الدعوة الثانية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top