2012-02-13 26 views
10

gì là sự khác biệt giữa:phân bổ NSString và khởi tạo

NSString *string1 = @"This is string 1."; 

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.]; 

Tại sao tôi không phân bổ và khởi tạo chuỗi đầu tiên, nhưng nó vẫn hoạt động? Tôi nghĩ tôi phải phân bổ NSString vì nó là một đối tượng?

Trong Cocoa Touch,

-(IBAction) clicked: (id)sender{ 
    NSString *titleOfButton = [sender titleForState:UIControlStateNormal]; 
    NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton]; 
    labelsText.text=newLabelText; 
    [newLabelText release]; 
} 

Tại sao tôi không cấp phát và khởi cho chuỗi titleOfButton? Liệu phương pháp tôi gọi có làm điều đó cho tôi không?

Ngoài ra, tôi đang sử dụng XCode 4, nhưng tôi không thích iOS 5 và như vậy, vì vậy tôi không sử dụng ARC nếu vấn đề đó quan trọng. Xin đừng nói rằng tôi nên, tôi chỉ ở đây để tìm hiểu lý do tại sao điều này là như vậy. Cảm ơn!

+0

bản sao có thể có của [Các đối tượng NSString cần phải được cấp phát và init?] (Http://stackoverflow.com/questions/637022/do-nsstring-objects-need-to-be-alloc-and-init) – Caleb

Trả lời

13

Biến số string1NSStringstring literal. Trình biên dịch phân bổ không gian cho nó trong tệp thi hành của bạn. Nó được nạp vào bộ nhớ và khởi tạo khi chương trình của bạn được chạy. Nó sống miễn là ứng dụng chạy. Bạn không cần phải retain hoặc release.

Tuổi thọ của biến số string2 miễn là bạn quyết định, đến mức khi bạn tham chiếu lần cuối cùng là release. Bạn phân bổ không gian cho nó, vì vậy bạn chịu trách nhiệm dọn dẹp sau đó.

Tuổi thọ của biến titleOfButton là tuổi thọ của phương pháp -clicked:. Đó là bởi vì phương pháp -titleForState: trả về một autorelease -d NSString. Chuỗi đó sẽ được phát hành tự động, khi bạn rời khỏi phạm vi của phương thức.

Bạn không cần phải tạo newLabelText. Bước đó là dư thừa và lộn xộn. Chỉ cần đặt thuộc tính labelsText.text thành titleOfButton:

labelsText.text = titleOfButton; 

Tại sao nên sử dụng các thuộc tính? Bởi vì thiết lập thuộc tính retain này sẽ tăng số lượng tham chiếu là titleOfButton bởi một (đó là lý do tại sao nó được gọi là tài sản retain), và do đó chuỗi được trỏ đến bởi titleOfButton sẽ tồn tại qua cuối -clicked:.

Một cách khác để suy nghĩ về việc sử dụng retain trong ví dụ này là labelsText.text là "chiếm quyền sở hữu" của chuỗi được trỏ đến bởi titleOfButton. Chuỗi đó sẽ tồn tại miễn là labelsText cuộc sống (trừ khi một số biến khác cũng chiếm quyền sở hữu chuỗi).

+0

Chỉ để mở rộng vào thời điểm này, các lệnh gọi 'retain' và' release' trên '@' kiểu chuỗi ký tự trong Objective C được bỏ qua một cách rõ ràng. Bạn có thể 'giải phóng' nó cả ngày và nó sẽ không được giải phóng. – StilesCrisis

+0

Vì vậy, về cơ bản, mọi thứ tôi có trong mã đó là chính xác và tôi có thể chỉ xóa chuỗi newLabelText? Và sau đó người dùng labelsText tổng hợp setter để đặt tiêu đề? Tôi vẫn còn loại mới, nhưng khi bạn nói 'thiết lập tài sản này giữ lại' là bạn nói tôi nên giữ lại nó? –

+0

Thuộc tính 'labelsText.text' giữ lại chuỗi bạn đặt.Vì vậy, bạn không cần phải sử dụng 'giữ lại', bởi vì bạn đang sử dụng phân bổ giá trị thuộc tính để làm điều đó cho bạn. Xem hướng dẫn này để có giải thích dài hơn về các thuộc tính Objective-C: http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial –

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