2008-12-01 23 views
19

Khi tạo một chuỗi sử dụng các ký hiệu sau:Là một NSString bằng chữ được tự động phát hành hay không cần phải được phát hành?

NSString *foo = @"Bar"; 

Có một cần phải giải phóng foo? Hoặc là foo được tự động phát hành trong trường hợp này?

+0

Tôi rất tiếc khi thêm câu trả lời quá muộn, nhưng tôi nghĩ bạn nên kiểm tra xem nó có hoàn chỉnh vì câu trả lời của Ben có một số sai lầm trong đó không. –

Trả lời

17

Chuỗi được phân bổ của trình biên dịch (có định dạng @ "STRING") là không đổi và các thông báo như vậy -retain, -release và -autorelease cho chúng bị bỏ qua. Bạn không phải phát hành hoặc tự động phát hành foo trong trường hợp này (nhưng nó sẽ không bị tổn thương).

+0

Tôi tìm thấy việc phát hành foo khiến chương trình của tôi gặp sự cố với "con trỏ được giải phóng không được phân bổ" – bobobobo

+0

@bobobobo Tôi hoàn toàn đồng ý với bạn. –

15

Như đã đề cập trong các tài liệu

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html

Bạn lấy quyền sở hữu của một đối tượng nếu bạn tạo ra nó sử dụng một phương pháp có tên bắt đầu với “alloc” hoặc “mới” hoặc chứa “ sao chép ”(ví dụ: phân bổ, newObject hoặc mutableCopy) hoặc nếu bạn gửi cho nó thông báo giữ lại. Bạn đang chịu trách nhiệm từ bỏ quyền sở hữu đối tượng bạn sở hữu bằng cách sử dụng bản phát hành hoặc tự động phát hành. Bất kỳ lúc nào khác bạn nhận được một đối tượng, bạn không được phát hành nó.

Vì bạn không sử dụng phân bổ, sao chép, v.v ... bạn không cần lo lắng về việc giải phóng đối tượng.

+0

Đây là câu trả lời hoàn chỉnh .... cảm ơn một lotttt –

+0

Mọi thay đổi sau ARC? Tôi đọc các chuỗi ký tự trong bộ nhớ và bị hủy khi chương trình ngừng chạy. Bạn nên tạo chuỗi bằng cách sử dụng phân bổ trên chữ? –

6

Tôi đồng ý với @Ben \ Gottlieb tại "biên dịch phân bổ dây (của định dạng @" STRING ") là hằng số" nhưng khi bạn đã không được khởi tạo chúng qua đi một thông điệp alloc hoặc retain, bạn không phải vượt qua release hoặc autorelease nhắn với họ bằng cách khác ứng dụng của bạn sẽ sụp đổ với các bản ghi sau

"con trỏ được trả tự do đã không phân bổ"

NOTE

NSString *str = [NSString string]; 

tương đương với:

NSString *str = [[[NSString alloc] init] autorelease]; 

nên release hoặc autorelease phải không được thông qua ở đây quá.