هل أتسرب الذاكرة هنا؟
-
23-09-2019 - |
سؤال
النظر في الطريقة التالية ، حيث أقوم بإنشاء سلسلة وأعيدها. أرغب في إطلاق اللبنات الأساسية للسلسلة ، ولكن بعد ذلك تعتمد السلسلة على القيم التي لم تعد موجودة. ماذا الآن؟
هل أتسرب الذاكرة وإذا كان الأمر كذلك ، فكيف يمكنني تصحيحها؟
- (NSString) getMiddahInEnglish:(int)day{
NSArray *middah = [[NSArray alloc] initWithObjects:@"Chesed", @"Gevurah", @"Tiferes", @"Netzach", @"Hod", @"Yesod", @"Malchus"];
NSString *firstPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day% 7)-1]];
NSString *secondPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day / 7)]];
NSString *middahStr = [NSString string@"%@ She'bi@%", firstPartOfMiddah, secondPartOfMiddah];
[middah release];
[firstPartOfMiddah release];
[secondPartOfMiddah release];
return middahStr;
}
في نهاية الطريقة ، سلسلة العودة ، middahStr
لم يتم إصداره. هذا هو مشكلة؟ هل أتسرب الذاكرة؟
المحلول
العكس تماما: أنت مفرط الإفراج.
middah
أنت تخصيص ويبت. ثم تطلقه. كل شيء على ما يرام.
firstPartOfMiddah
و secondPartOfMiddah
, ، يمكنك تسمية طريقة الراحة "StringWith" NSString. هذا يعادل التذرع بالتوضيح ، init ، و Autorelease. إن إطلاق سراحهم خطأ ، حيث يتم إعطاؤهم بشكل أساسي لإصدار Autorelease لاحقًا.
middahStr
أنت تسمي طريقة الراحة ، لكن إعادتها. كل شيء على ما يرام. سيتم إصداره لاحقًا بواسطة تجمع Autorelease.
قاعدة الإبهام (أنا متأكد من أن هناك الكثير من الاستثناءات): إذا لم تقم بتخصيصها ، فلا تطلقها.