จำเป็นต้องกำหนดสตริงให้กับตัวแปรก่อนที่จะเปรียบเทียบกับตัวแปรอื่นหรือไม่?


85

ฉันต้องการเปรียบเทียบค่าของNSStringสตริงกับสตริง "ผิด" นี่คือรหัสของฉัน:

NSString *wrongTxt = [[NSString alloc] initWithFormat:@"Wrong"];
if( [statusString isEqualToString:wrongTxt] ){
     doSomething;
}

ฉันต้องสร้าง NSString สำหรับ "ผิด" จริง ๆ หรือไม่?

นอกจากนี้ผมสามารถเปรียบเทียบค่าของที่UILabel's textสตริงโดยไม่ต้องกำหนดค่าฉลากเพื่อสตริง?


ยังไงก็ตามคุณเสียเวลากับ initWithFormat คุณสามารถเปลี่ยน NSString * wrongTxt = [[NSString จัดสรร] initWithFormat: @ "ผิด"]; ถึง NSString * wrongTxt = @ "ผิด"; รบกวนเฉพาะ initWithFormat ถ้าคุณจะพยายามคำนวณสตริงจากอินพุตอื่นเช่น NSString * wrongTxt = [[NSString จัดสรร] initWithFormat: @ "% @ ผิด% d ครั้ง", craigString, WrongCount];
Craig

คำตอบ:


178

ฉันต้องสร้าง NSString สำหรับ "ผิด" จริง ๆ หรือไม่?

ไม่ทำไมไม่ทำ:

if([statusString isEqualToString:@"Wrong"]){
    //doSomething;
}

การใช้@""เพียงแค่สร้างสตริงลิเทอรัลซึ่งเป็นไฟล์NSString.

นอกจากนี้ฉันสามารถเปรียบเทียบค่าของ UILabel.text กับสตริงโดยไม่กำหนดค่า label ให้กับสตริงได้หรือไม่

ได้คุณสามารถทำสิ่งต่างๆเช่น:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}

ที่ได้ผล ฉันเดาว่าฉันมีรหัสบั๊กกี้ มันถูกโยนข้อยกเว้นมาก่อน
Bryan

1
ในการอธิบายอย่างละเอียด: label.text เป็นสตริงดังนั้นคุณไม่จำเป็นต้องสร้างสตริงจากมันเพื่อการเปรียบเทียบ
Amagrammer


8

ไบรอันก็ควรค่าแก่การขว้างปาที่นี่เช่นกันคนอื่น ๆ ถูกต้องที่คุณไม่จำเป็นต้องประกาศตัวแปรสตริง อย่างไรก็ตามในครั้งต่อไปที่คุณต้องการประกาศสตริงคุณไม่จำเป็นต้องทำสิ่งต่อไปนี้:

NSString *myString = [[NSString alloc] initWithFormat:@"SomeText"];

แม้ว่าข้างต้นจะได้ผล แต่ก็มีตัวแปร NSString ที่เก็บไว้ซึ่งคุณจะต้องปล่อยอย่างชัดเจนหลังจากที่คุณใช้งานเสร็จแล้ว

ในครั้งต่อไปที่คุณต้องการตัวแปรสตริงคุณสามารถใช้สัญลักษณ์ "@" ได้อย่างสะดวกมากขึ้น:

NSString *myString = @"SomeText";

สิ่งนี้จะถูกปล่อยอัตโนมัติเมื่อคุณทำเสร็จแล้วดังนั้นคุณจะหลีกเลี่ยงการรั่วไหลของหน่วยความจำด้วย ...

หวังว่าจะช่วยได้!


ฉันสงสัยเกี่ยวกับเรื่องนั้น ฉันมักจะเห็นตัวแปรสตริงที่เป็นวัตถุ c วัตถุประสงค์ แต่จะไม่ถูกปล่อยออกมา ขอบคุณ!
Bryan

2
คำใบ้อยู่ในบิต "จัดสรร" หากคุณใช้ Alloc (หรือ Copy) คุณต้องปล่อยโดยเฉพาะ หากคุณไม่ทำตามหลักการก็คือวัตถุจะถูกตั้งค่าเป็นรีลีสอัตโนมัติแล้ว
h4xxr

ได้แม้ว่าจะมีnewหรือcopyตัวอย่างเช่นnewObject(จากNSDictionaryController) หรือmutableCopy(จากNSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski

2

คุณยังสามารถใช้เมธอดคลาส NSString ซึ่งจะสร้างอินสแตนซ์ที่ปล่อยอัตโนมัติและมีตัวเลือกเพิ่มเติมเช่นการจัดรูปแบบสตริง:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.