about bank

วันพฤหัสบดี, ธันวาคม 23, 2547

แก้ปัญหา 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]



<< หน้าแรก