2010-06-18 39 views
5

Tôi đã xem mã của người khác và nhận thấy họ được gọi là 'phát hành' trên một NSString họ không sở hữu (không bao giờ được gọi là phân bổ/giữ lại/sao chép bất cứ nơi nào và nó không phải là tài sản).Gọi 'phát hành' quá nhiều lần?

Điều này có vẻ hơi lạ với tôi và điều đó khiến tôi tự hỏi liệu có bất kỳ hành vi lạ nào xảy ra nếu bạn gọi 'phát hành' trên một đối tượng mà bạn không 'sở hữu' hoặc số ref đã là 0? Các mã dưới đây biên dịch/chạy tốt mà không có cảnh báo vì vậy tôi đoán không có vấn đề nhưng tôi chỉ tò mò.

// Releasing an object I don't own 
NSString *notMyString = [NSString stringWithString:@"Not mine."]; 
[notMyString release]; // Ignored? 

// Releasing an object I own, twice 
NSString *myString = [[NSString alloc] initWithString:@"Mine."]; 
[myString release]; // Ref count = 0 
[myString release]; // Ref count = ? 
+2

Lý do tại sao mã "hoạt động" là do NSString's -initWithString: nhận ra rằng chuỗi được truyền vào là một chuỗi không đổi và do đó, không cần phân bổ mới. Vì chuỗi không đổi có hiệu quả bỏ qua việc giữ lại/giải phóng, mã hoạt động trùng hợp. – bbum

Trả lời

15

Vâng, đừng làm vậy. Đánh giá của bạn là chính xác, cũng như sự hiểu biết của bạn về các quy tắc quyền sở hữu. Gửi tin nhắn đến một đối tượng đã được phát hành có hành vi không xác định - đôi khi bạn sẽ gặp may vì những thứ khác đang diễn ra và không có gì xảy ra. Đôi khi bạn sẽ sụp đổ ngay lập tức, đôi khi sau đó bởi vì bạn đã làm hỏng cái gì khác.

+2

Vâng đó là hành vi lâu dài mà tôi đã lo lắng. Đoán rằng bạn không thể luôn tin tưởng vào mã 'hướng dẫn' blog ngẫu nhiên như-là =). Cảm ơn vì sớm phản hồi. – nebs

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