Có cần phải gán một chuỗi cho một biến trước khi so sánh nó với một biến khác không?


85

Tôi muốn so sánh giá trị của an NSStringvới chuỗi "Sai". Đây là mã của tôi:

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

Tôi có thực sự phải tạo một NSString cho "Sai" không?

Ngoài ra, tôi có thể so sánh giá trị của a UILabel' textvới một chuỗi mà không gán giá trị nhãn cho một chuỗi không?


Nhân tiện, bạn đang lãng phí thời gian với initWithFormat, bạn có thể thay đổi NSString * saiTxt = [[NSString CẤP] initWithFormat: @ "Wrong"]; thành NSString * saiTxt = @ "Sai"; Chỉ bận tâm với initWithFormat nếu bạn định tính toán một chuỗi từ các đầu vào khác, ví dụ: NSString * falseTxt = [[NSString Distribution] initWithFormat: @ "% @ đã sai% d lần", craigString, saiCount];
Craig

Câu trả lời:


178

Tôi có thực sự phải tạo một NSString cho "Sai" không?

Không, tại sao không chỉ làm:

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

Việc sử dụng @""chỉ đơn giản là tạo ra một chuỗi ký tự, là một ký tự hợp lệ NSString.

Ngoài ra, tôi có thể so sánh giá trị của UILabel.text với một chuỗi mà không gán giá trị nhãn cho một chuỗi không?

Có, bạn có thể làm điều gì đó như:

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

Điều đó hoạt động. Tôi đoán tôi chỉ có mã lỗi. Nó đã ném một ngoại lệ trước đây.
Bryan

1
Nói rõ hơn: label.text một chuỗi, vì vậy tất nhiên bạn không cần phải tạo một chuỗi từ nó để so sánh.
Amagrammer

26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}

Cảm ơn wevah. Perspx nhanh hơn 1 giây.
Bryan

8

Brian, cũng đáng để ném vào đây - những người khác tất nhiên đúng rằng bạn không cần phải khai báo một biến chuỗi. Tuy nhiên, lần sau nếu bạn muốn khai báo một chuỗi, bạn không cần phải làm như sau:

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

Mặc dù cách trên hoạt động nhưng nó cung cấp một biến NSString được giữ lại mà sau đó bạn sẽ cần phát hành rõ ràng sau khi sử dụng xong.

Lần tới khi bạn muốn một biến chuỗi, bạn có thể sử dụng ký hiệu "@" theo cách thuận tiện hơn nhiều:

NSString *myString = @"SomeText";

Điều này sẽ được tự động trả lại khi bạn hoàn thành nó, do đó bạn cũng sẽ tránh bị rò rỉ bộ nhớ ...

Hy vọng rằng sẽ giúp!


Tôi đã tự hỏi về điều đó. Tôi thường thấy các biến chuỗi là đối tượng c khách quan, nhưng chúng không bao giờ được giải phóng. Cảm ơn!
Bryan

2
Gợi ý nằm trong bit "phân bổ". Nếu bạn sử dụng Alloc (hoặc Copy) thì bạn phải phát hành cụ thể. Nếu bạn không, quy ước là đối tượng sẽ được đặt thành tự động vui lòng.
h4xxr

Có, mặc dù nó có thể chứa newhoặc copyví dụ newObject(từ NSDictionaryController) hoặc mutableCopy(từ NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/...
Alex Rozanski

2

Bạn cũng có thể sử dụng các phương thức lớp NSString, phương thức này cũng sẽ tạo một phiên bản tự động phát hành và có nhiều tùy chọn hơn như định dạng chuỗi:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.