2010-03-02 27 views
5

Tôi đã có thông báo EXC_BAD_ACCESS trong bảng điều khiển của mình. Tôi đọc về các biến môi trường NSZombieEnabled và MallocStackLoggingNoCompact trên this site. Tôi đã tạo biến môi trường của mình: NSZombieEnabled = YESMallocStackLoggingNoCompact = 1. Trong giao diện điều khiển, tôi thấyGỡ lỗi EXC_BAD_ACCESS từ số NSString

2010-03-01 19: 13: 46,924 CruzNomad [7952: 207] *** - [CFString stringByAddingPercentEscapesUsingEncoding:]: tin nhắn gửi đến dụ deallocated 0x58448e0

Sau đó tại (gdb) nhanh chóng, tôi đã làm thông tin malloc-lịch sử 0x58448e0, mà đã cho tôi:

Alloc: Block address: 0x058448e0 length: 64 
Stack - pthread: 0xa0b33500 number of frames: 25 
    0: 0x98e089bc in malloc_zone_malloc 
    1: 0x21516aa in _CFRuntimeCreateInstance 
    2: 0x2152bf8 in __CFStringCreateImmutableFunnel3 
    3: 0x21567d9 in CFStringCreateCopy 
    4: 0x21742fc in _CFStringCreateWithFormatAndArgumentsAux 
    5: 0xdb546 in -[NSPlaceholderString initWithFormat:locale:arguments:] 
    6: 0xdb4d8 in +[NSString stringWithFormat:] 
    7: 0x23aa3 in -[BuisnessCardViewController viewDidLoad] at /Users/.../Classes/BuisnessCardViewController.m:85 
    8: 0x3d6796 in -[UIViewController view] 
    9: 0x347b4 in -[gm_menuViewController btn5_Pressed:] at /Users/.../Classes/menuViewController.m:535 
    10: 0x357459 in -[UIApplication sendAction:to:from:forEvent:] 
    11: 0x3baba2 in -[UIControl sendAction:to:forEvent:] 
    12: 0x3bcdc3 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] 
    13: 0x3bbb0f in -[UIControl touchesEnded:withEvent:] 
    14: 0x370e33 in -[UIWindow _sendTouchesForEvent:] 
    15: 0x35a81c in -[UIApplication sendEvent:] 
    16: 0x3610b5 in _UIApplicationHandleEvent 
    17: 0x2984ed1 in PurpleEventCallback 
    18: 0x2197b80 in CFRunLoopRunSpecific 
    19: 0x2196c48 in CFRunLoopRunInMode 
    20: 0x298378d in GSEventRunModal 
    21: 0x2983852 in GSEventRun 
    22: 0x362003 in UIApplicationMain 
    23: 0x2c8c in main at /Users/.../source/main.m:14 
    24: 0x2bfa in start 

Dòng 7 cho biết sự cố nằm trong dòng 85 của BuisnessCardViewController.m. dòng đó là ở đây:

fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString]; 

Tôi đang phụ thêm các nội dung của fullAddressmyString và lưu trữ nó trở lại trong fullAddress.

Nếu tôi diễn giải chính xác điều này, có vẻ như sau dòng này, fullAddress được deallocated. Khi tôi thả điểm ngắt và di chuột qua biến, giá trị của nó cho biết "nằm ngoài phạm vi".

fullAddress hoạt động sau trong phương pháp này. Tôi sử dụng nó để gửi để gửi cho Google để mã hóa địa lý ngược trong dòng 164 của cùng một phương pháp.

NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [fullAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

Ngay cả ở đây, nó nói "nằm ngoài phạm vi". Tôi đang bối rối ... lời khuyên nào ??

Cảm ơn!

Thomas

+0

Bạn có thể đăng thêm một chút ngữ cảnh không? Nếu nó nói rằng biến đó nằm ngoài phạm vi, chúng ta có thể thấy toàn bộ phạm vi không? –

+0

Bạn đang sử dụng 'fullAddress' hoặc' myString' ở bất kỳ nơi nào khác? – FelixLam

+0

Ngoài ra, chỉ trong trường hợp đó là một tai nạn, bạn đã viết sai chính tả là Kinh doanh. – dreamlax

Trả lời

3

Trong hầu hết các trường hợp này xảy ra khi bạn không giữ lại một thuộc tính đó là đối tượng và gửi tin nhắn muộn để nó trong các phương pháp khác, muộn.

Vì vậy, nơi mà một số chuỗi được khởi tạo thử:

[fullAddress retain]; 

hoặc

[myString retain]; 

tùy cái nào được khởi tạo trong phương pháp khác.

+0

Nếu câu trả lời không hoàn toàn rõ ràng, xin lỗi cho ngôn ngữ của tôi, xin vui lòng và viết bình luận dưới đây. – mxg

1

Các bạn đã thử phụ thêm chuỗi với định dạng?

fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString]; 

với:

- (NSString *)stringByAppendingFormat:(NSString *)format ... 

như thế này:

[fullAddress stringByAppendingFormat:@" %@", myString]; 
+0

Cảm ơn bạn đã trả lời, mọi người. Và không, tôi không nhận ra rằng Business bị viết sai. @dreamlax - Tôi không viết lớp đó (cảm ơn lol): -) ... Tôi chỉ đang làm việc với các tính năng cụ thể. Cảm ơn bạn đã chỉ ra nó! Tôi đã tìm ra vấn đề của mình. Vì stringWithFormat trả về một đối tượng autoreleased, tôi chỉ giữ lại nó ngay sau khi tôi sử dụng nó lần đầu tiên trong phương thức này. [fullAddress retain]; đã thực hiện thủ thuật (như tôi đã thấy mxg đã đề xuất). Một lần nữa, cảm ơn tất cả mọi người! -Thomas – Thomas