Trình gỡ rối của tôi bị hỏng hoặc có điều gì đó cơ bản mà tôi không hiểu.Simple Objective-C over-release rằng * nên * crash không bị lỗi. Tại sao?
Tôi có một số mã rất cơ bản trong một chương trình dòng lệnh rất cơ bản là nên lỗi. Tuy nhiên, nó không bị rơi.
int main (int argc, const char * argv[])
{
NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
NSLog(@"Length: %d", [string length]);
return 0;
}
Bản ghi nhật ký in "Độ dài: 5" như bạn mong đợi cho chuỗi hợp lệ. Tuy nhiên, chuỗi nên được deallocated bởi điểm đó và một lỗi exec_bad_access
nên được ném.
Tôi đã thử mã này với trình gỡ lỗi được đính kèm và không kèm theo trình gỡ lỗi - cả hai đều cho kết quả tương tự. Tôi cũng đã kích hoạt (và vô hiệu hóa) NSZombie
, mà dường như không có hiệu lực (ban đầu tôi nghĩ rằng đây là vấn đề, vì NSZombie
đối tượng không bao giờ được deallocated - nhưng nó vẫn không sụp đổ với NSZombie
vô hiệu hóa).
Tôi có điểm ngắt được đặt trong tệp .gdbinit
cục bộ của mình để chia nhỏ những thứ như -[NSException raise]
và objc_exception_throw
. Tôi cũng có các điểm ngắt được đặt trên nhiều phương thức trên NSZombie
để bắt chúng.
fb -[NSException raise]
fb -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:]
fb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
#define NSZombies
# this will give you help messages. Set to NO to turn them off.
set env MallocHelp=YES
# might also be set in launch arguments.
set env NSZombieEnabled=YES
set env NSDeallocateZombies=NO
set env MallocCheckHeapEach=100000
set env MallocCheckHeapStart=100000
set env MallocScribble=YES
set env MallocGuardEdges=YES
set env MallocCheckHeapAbort=1
set env CFZombie 5
fb -[_NSZombie init]
fb -[_NSZombie retainCount]
fb -[_NSZombie retain]
fb -[_NSZombie release]
fb -[_NSZombie autorelease]
fb -[_NSZombie methodSignatureForSelector:]
fb -[_NSZombie respondsToSelector:]
fb -[_NSZombie forwardInvocation:]
fb -[_NSZombie class]
fb -[_NSZombie dealloc]
fb szone_error
fb objc_exception_throw
Với những breakpoint thiết lập và NSZombie kích hoạt, tôi sẽ nhận được một cái gì đó giống như [NSString length]: message sent to deallocated instance 0x100010d39
in ra cửa sổ Console, nhưng tôi không thấy điều này. Tôi thấy chiều dài NSLog
in là 5.
Tôi thấy hành vi tương tự với các lớp khác như NSURL
và NSNumber
. Nhưng một số lớp học bị hỏng như mong đợi, chẳng hạn như NSError
và NSObject
.
Điều này có liên quan gì đến các cụm lớp không? Họ không tuân theo các quy tắc tương tự liên quan đến quản lý bộ nhớ?
Nếu nhóm lớp không liên quan đến vấn đề này, tính năng phổ biến duy nhất tôi có thể thấy là các lớp không bị hỏng theo cách này đều là cầu nối miễn phí với đối tác Core Foundation. Điều này có thể có cái gì để làm với nó?
Tôi đã tự hỏi bản thân mình một thời gian trước đây, đã thấy cùng một 'vấn đề'/hành vi. Hy vọng ai đó có thể giải thích điều này. – Rits
Bộ sưu tập rác không phải là ngay lập tức? :) – willcodejavaforfood
Đó không phải là vấn đề. Trong môi trường thu thập rác, một lời gọi rõ ràng để 'phát hành' hoàn toàn không có gì. – Yuji