เริ่มต้น NSMutableArray: [อาร์เรย์ NSMutableArray];

หากคุณเริ่มต้น NSMutableArray ด้วยวิธีสะดวกของ NSArray ดังที่กล่าวมาข้างต้น คุณจะได้รับ NSArray หรือ NSMutableArray หรือไม่

มีผลกระทบอะไรบ้าง?

(ฉันรู้ว่า NSMutableArray มี "arrayWithCapacity: ฉันแค่สงสัย)


person Corey Floyd    schedule 09.05.2009    source แหล่งที่มา
comment
ฉันขอขอบคุณการสนทนาที่น่าสนใจด้านล่างสำหรับคำถามง่ายๆ มันนำมาซึ่งจุดโกโก้ที่ละเอียดอ่อนเล็กน้อย   -  person Corey Floyd    schedule 12.05.2009


คำตอบ (2)


หากคุณเริ่มต้นโดยใช้:

NSMutableArray *array = [NSMutableArray array];

คุณได้รับ NSMutableArray คุณสมบัติที่ยอดเยี่ยมอย่างหนึ่งของ Objective-C ก็คือวิธีการเรียนนั้นสืบทอดมาจากคลาสย่อย

ดังนั้นใน class method คุณสามารถทำสิ่งนี้ได้:

+(id)array {
    return [[[self alloc] init] autorelease];
}

และ self จะอ้างอิงถึงคลาสอ็อบเจ็กต์ที่มีการรันโค้ด (NSArray หรือ NSMutableArray)

person pgb    schedule 09.05.2009
comment
อ่า น่าสนใจ ดังนั้นตนเองจึงอ้างอิงถึง Class Object: NSMutableArray นั่นสมเหตุสมผลแล้ว ฉันสงสัยว่าทำไมรหัสของฉันถึงไม่พัง! - person Corey Floyd; 10.05.2009
comment
ฉันคิดว่าคุณจะทำจริง: return [[[self alloc] init] autorelease]; - person Don McCaughey; 10.05.2009

อัปเดต: แม้ว่าคำแนะนำของฉันในการ "ทดสอบด้วยตัวเอง" โดยทั่วไปแล้วเป็นความคิดที่ดี แต่ก็น่ายินดีเล็กน้อยในกรณีนี้ ขอบคุณ Jim ในความคิดเห็นที่ชี้ให้เห็นว่าคำแนะนำของฉันด้านล่างใช้ไม่ได้ผลดีกับคลาสเหล่านี้ เนื่องจาก NSArray รูปแบบต่างๆ ล้วนถูกนำไปใช้โดยคลาสเชื่อมโยงแบบโทรฟรีของ CoreFoundation

----- คำตอบเดิมสำหรับบริบทด้านล่าง -----

วิธีที่ง่ายที่สุดในการตอบคำถามเช่นนี้คือการทดสอบด้วยตัวเอง ลองจัดสรรอาร์เรย์ในแบบที่คุณสงสัย จากนั้น NSLog จากโค้ดของคุณ:

NSLog(@"เราได้รับ %@", NSStringFromClass([theArray class]));

person danielpunkass    schedule 10.05.2009
comment
แน่นอนว่ามันจะกลับมา NSCFArray เสมอ? - person Jim Dovey; 12.05.2009
comment
จุดที่ดีจิม ฉันลืมเกี่ยวกับลักษณะเฉพาะของ NSArray นั้น แก้ไขคำตอบของฉันด้านบน ขอบคุณ. - person danielpunkass; 12.05.2009
comment
อืม น่าสนใจนะ ดังนั้นแม้แต่ NSMutableArray ก็จะคาย NSCFArray กลับคืนมาใช่ไหม นั่นทำให้เป็นการยากที่จะวิปัสสนาและดูว่าคุณมีวัตถุที่ไม่แน่นอนหรือไม่ก่อนที่จะลองเปลี่ยนมัน ฉันเดาว่าคุณสามารถตอบกลับ ToSelector ได้ในกรณีนั้น ขอขอบคุณสำหรับพอดแคสต์ที่ยอดเยี่ยมของคุณ ฉันได้กลับไปฟังตอนที่ผ่านมาของคุณกับ Manton ส่วนใหญ่แล้ว ค่อนข้างสนุกสนานและให้ข้อมูล - person Corey Floyd; 12.05.2009
comment
ใช่ การใช้ responsesToSelector ดูเหมือนจะเป็นแนวทางที่สมเหตุสมผล ฉันไม่รู้ อาจมีวิธีที่ดีกว่าในการตรวจสอบความไม่แน่นอน ดีใจที่คุณเพลิดเพลินกับพอดแคสต์! - person danielpunkass; 12.05.2009
comment
น่าเสียดายที่มันเป็นไปไม่ได้ NSCFArray ใช้วิธีการชุดเดียว และจะไม่เปลี่ยนแปลงรายการนั้นหากบังเอิญเป็นอินสแตนซ์ที่ไม่แน่นอน ทุกส่วนของฟังก์ชันการโทรฟรีสุดเก๋: NSCFArray จริงๆ แล้วเป็นคำอธิบายคลาส ObjC ที่นำไปใช้กับอินสแตนซ์ CFArrayRef หรืออีกนัยหนึ่งคือสร้าง CFArrayRef เรียก [ref class] และมันจะส่งคืน NSCFArray วิธีเดียวที่ฉันรู้ว่าจะทดสอบความผันแปรได้อย่างน่าเชื่อถือคือการรวมไว้ในบล็อก try/catch และจัดการ NSInternalInconsistencyException ที่จะเพิ่มขึ้นหากไม่สามารถเปลี่ยนใจได้จริงๆ นั่นหรือขุดเข้าไปในแหล่ง CF และตรวจสอบบิตส่วนหัว CF ;) - person Jim Dovey; 12.05.2009
comment
ว้าว. ฉันไม่สามารถนึกถึงกรณีที่ฉันจะไม่รู้ว่าฉันกำลังเผชิญกับวัตถุที่ไม่แน่นอนหรือไม่ แต่นั่นเป็นการเต้นรำที่ดีอย่างแน่นอนเพื่อตรวจสอบความไม่แน่นอน นี่เป็นเพียงการฝึกใช้สติปัญญามากกว่า แต่จะเผยให้เห็นปัญหาแปลกๆ ที่คุณอาจพบเจอและเสียเวลาหลายชั่วโมงไปกับมัน - person Corey Floyd; 13.05.2009