แก้ปัญหา error เกียบกับ memory management
วันนี้คุยกับ xnu พยายามทำให้เกิด bug จาก memory management ก็หาอยู่พักใหญ่เลย จำได้ว่าเคยเจอ error แบบนี้ ก็ได้ความช่วยเหลือจาก xnu ทำให้ได้ bug ตัวนี้มา
อยากให้ลองศึกษาดูครับ คิดว่าเป็นประโยชน์อย่างมาก โดยเฉพาะ กับคนที่เริ่มต้นเขียนโปรแกรมด้วยภาษา Objective-C เพราะจะช่วยให้เราเข้าใจ memory managment กันมากขึ้น
สืบเนื่องจากการ post ครั้งที่แล้วนะ ให้เปลี่ยนส่วนของการใส่ object DataDic ลงใน array ของ main.m
int main (int argc, const char * argv[]) {
NSMutableArray *myArray = [NSMutableArray new];
DataDic *dd3;
int i;
NSAutoreleasePool * pool = [NSAutoreleasePool new];
for (i=0; i<2; i++){
str = [NSString stringWithFormat:@"Double %d",i];
dd3 = [DataDic new];
[dd3 setName:str];
[myArray addObject:dd3];
[dd3 release];
}
[pool release];
DataDic *wd = [myArray objectAtIndex:0];
NSLog(@"wd equal %@", [wd name]);
DataDic *wd2 = [myArray objectAtIndex:1];
NSLog(@"wd2 equal %@", [wd2 name]);
return 0;
}
ตรงนี้จะเกิด error คือค่าใน memory ของเราหายไปครับ เนื่องจากถูก release โดย [pool release] และหลายครั้งที่เราจำเป็นต้องทำ อยางในการอ่าน xml ที่น่าจะ post วันพรุ่งนี้ก็ต้องใช้
วิธีแก้ก็นิดเดียวเอง แค่เปลี่ยน method setName ใน DataDic.m จากแบบนี้
- (void) setName:(NSString *)newName {
_name = newName;
}
ให้เป็นแบบนี้
- (void) setName:(NSString *)newName {
if(_name != newName){
[newName retain];
[_name release];
_name = newName;
}
}
จริงๆ แล้วมันสำคัญอยู่ที่ [newName retain] เพราะเป็นการเพิ่มจำนวนโซ่ (หมายถึงจำนวน pointer ที่ตัวแปลนับอยู่) ให้กับตัวแปลที่ส่งเข้ามา เพื่อให้มันไม่ถูก release เวลาที่ pointer ที่เคยชี้อยู่หายไป

0 ความคิดเห็น:
แสดงความคิดเห็น
สมัครสมาชิก ส่งความคิดเห็น [Atom]
<< หน้าแรก