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 = ?
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