2011-12-03 32 views
5

Cuốn sách Tôi hiện đang đọc đã cho tôi viết đoạn mã sau:NSArray và NSString

-(IBAction)displaySomeText:(id)sender { 
    NSString *cow = @"Milk"; 
    NSString *chicken = @"Egg"; 
    NSString *goat = @"Butter"; 

    NSArray *food = [NSArray arrayWithObjects:cow, chicken, goat, nil]; 

    NSString *string = @"The shopping list is: "; 
    string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

    [textView insertText:string]; 

}

Tôi hiểu phần nào cách mảng làm việc nhưng tôi cần giúp đỡ để hiểu đoạn mã sau

string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

Tôi chưa bao giờ nhìn thấy một trường hợp mà điều này là có thể.

Ông có tôi tạo ra một 'chuỗi' đối tượng, từ lớp NSString, và sau đó tôi đang làm điều này

string = [string stringByAppendingString:]; 

Tôi đang bối rối. Tôi chưa bao giờ thấy một ví dụ mà tôi tạo một đối tượng và sau đó thực hiện một phương thức trên cùng một đối tượng và lưu nó trong cùng một đối tượng chính xác.

Ví dụ, tôi biết tôi có thể làm điều này

NSSound *chirp; 
chirp = [NSSound soundNamed:@"birdChirp.mp3"]; 

ở trên có ý nghĩa bởi vì tôi đã sử dụng các đối tượng được tạo ra và thực hiện một phương thức lớp trên nó ..

nhưng tôi luôn cho rằng tương đương không thể có mã sau đây

chirp = [chirp methodNameEtc..]; 

Tôi hy vọng tôi đã giải thích tốt câu hỏi của mình. Nếu không, tôi luôn có thể xây dựng thêm.

Trả lời

4

Tôi nghĩ rằng đây là trung tâm của câu hỏi của bạn "Tôi đang bối rối. Tôi chưa bao giờ thấy một ví dụ nơi tôi tạo một đối tượng và sau đó thực hiện một phương pháp trên cùng một đối tượng và lưu trữ nó trong cùng một đối tượng."

Để trả lời câu hỏi đó, bạn không thực sự 'lưu trữ nó trong cùng một đối tượng'. Những gì bạn đang làm là gây nhầm lẫn pointersobjects.

Hãy chỉ nhìn vào dòng này:

string = [string stringByAppendingString:@"Hello"];

Trong dòng 'string' đây là một pointer, không phải là object nó trỏ tới. Dòng mã này nói gì: "Object hiện đang được tham chiếu bởi 'pointer' chuỗi ', hãy trả lại cho tôi một số mới NSStringobject có văn bản là văn bản của bạn với văn bản này được thêm vào và khi tôi nhận được điều đó mới NSStringobject Tôi đã ra lệnh làm cho pointer 'chuỗi' trỏ đến đó object thay thế. "

+0

Vâng, cảm ơn. Đây là câu trả lời tốt nhất cho đến nay. Tôi rất vui vì bạn đã thấy qua tất cả những điều đó, lol. Cảm ơn rất nhiều. –

+1

Câu hỏi này có vẻ ngu ngốc nhưng tôi không lập trình nhiều trong ObjC: Vì Strings không thay đổi, điều này không gây ra rò rỉ bộ nhớ vì đối tượng chuỗi ban đầu giờ không có con trỏ đến nó (vì stringByAppendingString trả về một đối tượng chuỗi mới) ? – styfle

+0

Có. Các chuỗi cũ đã được dereferenced như bạn nói. Điều này là okay nếu đối tượng dereferenced là autoreleased hoặc một chuỗi chữ được tạo ra như 'NSString * cow = @" Milk "' nhưng nếu nó là một chuỗi được giữ lại sẽ là một rò rỉ bộ nhớ. Điều thú vị nhất là các câu hỏi rò rỉ bộ nhớ trên trang này dường như là những con trỏ và các đối tượng khó hiểu. – NJones

2
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

cũng giống như

NSString *tmpString = [food componentsJoinedByString:@", "]; 
string = [string stringByAppendingString:tmpString]; 

Vì vậy, trong ví dụ này, các dấu ngoặc vuông trong cùng được đánh giá đầu tiên, và sau đó là ngoài cùng. Điều đó làm rõ nó một chút? Thing của nó như dấu ngoặc đơn trong toán học: (1 * 2 * (1 + 2)) ... trong cùng() được đánh giá trước khi bạn có thể xác định rằng vấn đề thực sự là 1 * 2 * 3. Đó là những gì đang xảy ra với [food componentsJoinedByString:@", "].

1

stringByAppendingString không lưu trữ chuỗi trong cùng một đối tượng chính xác. Đó là một đối tượng NSString tạo đối tượng mới (tự động phát hành) NSString.

Không có ví dụ tương đương cho chirp (mà là một đối tượng NSSound), trừ khi bạn tạo mục riêng của bạn mà kéo dài NSSound với một phương pháp để trả lại một thương hiệu đối tượng mới NSSound.

Làm cho tinh thần?

Ồ, tôi cũng đánh giá cao biểu tượng Takizawa của bạn.

+0

Cảm ơn rất nhiều tất cả những ai đã trả lời. Bây giờ tôi hiểu rồi. –

Các vấn đề liên quan