2010-09-09 30 views
5

Tôi đang cố gắng sử dụng một đơn giản UITextView trong chế độ xem cơ bản, nhưng nó khiến ứng dụng gặp sự cố không thường xuyên. Đôi khi nó bị treo khi tôi đang gõ gì đó trong đó, đôi khi tôi đang cuộn, đôi khi sau khi tôi nhấn phím trả về. Từ theo dõi ngăn xếp, có vẻ như nó được gây ra bởi mã đồ họa hoặc hoạt ảnh liên quan để hiển thị các yếu tố giao diện người dùng để kiểm tra lỗi chính tả, kiểm tra ngữ pháp, v.v.Simple UITextView crashing

Tại sao ứng dụng này bị lỗi? Tôi có cần phải nhập các thư viện bổ sung hay tôi cần chỉ định một số loại đại biểu cho UITextView? Tôi có nghĩa là chỉ có một UITextView đơn giản trong một khung nhìn barebones, không có gì lạ mắt.

Dưới đây là stack trace:

Program received signal: “EXC_BAD_ACCESS”. 
(gdb) bt 
#0 0x9535f9b1 in ??() 
#1 0x9534c33f in ??() 
#2 0x9534c13e in ??() 
#3 0x9634df5c in ??() 
#4 0x9418d244 in CGDataProviderRetain() 
#5 0x963b7036 in ??() 
#6 0x98263486 in CGImageReadCreateWithProvider() 
#7 0x982633a2 in CGImageSourceCreateWithDataProvider() 
#8 0x020c0947 in CGImageCreateWithPNGDataProvider() 
#9 0x02ebfeed in WKGraphicsCreateImageFromBundleWithName() 
#10 0x02ebfc3b in WebCore::GraphicsContext::drawLineForMisspellingOrBadGrammar() 
#11 0x02ebf9cb in WebCore::InlineTextBox::paintSpellingOrGrammarMarker() 
#12 0x02e73932 in WebCore::InlineTextBox::paintDocumentMarkers() 
#13 0x02e730a1 in WebCore::InlineTextBox::paint() 
#14 0x02e717ef in WebCore::InlineFlowBox::paint() 
#15 0x02e71565 in WebCore::RootInlineBox::paint() 
#16 0x02e71220 in WebCore::RenderLineBoxList::paint() 
#17 0x0354c451 in WebCore::RenderBlock::paintContents() 
#18 0x02e6d7bd in WebCore::RenderBlock::paintObject() 
#19 0x02e6ed51 in WebCore::RenderBlock::paint() 
#20 0x02e6dcf2 in WebCore::RenderBlock::paintChildren() 
#21 0x02e6d7bd in WebCore::RenderBlock::paintObject() 
#22 0x02e6ed51 in WebCore::RenderBlock::paint() 
#23 0x02e6c502 in WebCore::RenderLayer::paintLayer() 
#24 0x02e6bce3 in WebCore::RenderLayer::paintLayer() 
#25 0x02e6b635 in WebCore::RenderLayer::paint() 
#26 0x02e6b3de in WebCore::FrameView::paintContents() 
#27 0x03bd71da in -[WebFrame(WebInternal) _drawRect:contentsOnly:]() 
#28 0x03bd7104 in -[WebHTMLView drawSingleRect:]() 
#29 0x02e6af68 in _WKViewDraw() 
#30 0x02e6b03f in _WKViewDraw() 
#31 0x02e6b03f in _WKViewDraw() 
#32 0x02e6b03f in _WKViewDraw() 
#33 0x02e6b03f in _WKViewDraw() 
#34 0x02e6adb0 in WKViewDisplayRect() 
#35 0x02e6ad41 in WKWindowDrawRect() 
#36 0x02e6a9d3 in WebCore::TileCache::drawLayer() 
#37 0x04041d63 in backing_callback() 
#38 0x0404161e in CABackingStoreUpdate() 
#39 0x040407f4 in -[CALayer _display]() 
#40 0x02e6a3d4 in -[TileLayer display]() 
#41 0x040402b1 in CALayerDisplayIfNeeded() 
#42 0x0403f65b in CA::Context::commit_transaction() 
#43 0x0403f2b0 in CA::Transaction::commit() 
#44 0x04046f5b in CA::Transaction::observer_callback() 
#45 0x02391d1b in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
#46 0x02326987 in __CFRunLoopDoObservers() 
#47 0x022efc17 in __CFRunLoopRun() 
#48 0x022ef280 in CFRunLoopRunSpecific() 
#49 0x022ef1a1 in CFRunLoopRunInMode() 
#50 0x02c152c8 in GSEventRunModal() 
#51 0x02c1538d in GSEventRun() 
#52 0x002e2b58 in UIApplicationMain() 

EDIT: nó có vẻ như điều này được thực sự được gây ra bởi các chức năng autocorrection, như stack trace ám chỉ. Nếu tôi đặt thuộc tính "Correction" trong "Text Input Traits" trong Interface Builder (tôi tin rằng đó là thuộc tính autocorrectionType của giao thức UITextInputTraits) thành "No", thì vấn đề sẽ biến mất. Với tính năng tự động sửa lỗi, tôi luôn có thể tạo lại lỗi bằng cách nhập các từ sai chính tả.

Một điều cần lưu ý là đây là SDK iOS 4.1 mới nhất mà tôi vừa tải xuống hôm qua, vì vậy tôi không biết đây có phải là lỗi UITextView trong SDK mới nhất hay không.

CHỈNH SỬA 2: Ồ, tôi thực sự bối rối vì điều này. Tôi đã tạo ra một vài dự án mới từ đầu và cố gắng hiển thị các bộ điều khiển xem phương thức với UITextViews, và tất cả chúng đều không có vấn đề gì. Tuy nhiên, khi tôi cố gắng làm tương tự trong ứng dụng thực tế của mình - bất kể bộ điều khiển nào tôi cố gắng gọi một bộ điều khiển chế độ xem từ - nó luôn luôn bị treo. Tôi đã đun sôi mã xuống thanh barebones và nó vẫn bị treo. Dưới đây là cách tôi khởi tạo trình điều khiển chế độ xem phương thức:

- (IBAction)showFeedback:(id)sender { 
    FooViewController *controller = [[FooViewController alloc] initWithNibName:@"FooView" bundle:nil]; 
    [self presentModalViewController:controller animated:YES]; 
    [controller release]; 
} 

FooViewController chỉ là bộ điều khiển chế độ xem khung được tạo bởi Xcode kế thừa từ UIViewController. Không có gì bị ghi đè. Tệp nib của tôi chỉ chứa một khung nhìn trống rỗng với một khung nhìn đơn thuần là UITextView. Mọi thứ khác là mặc định.

Sự cố luôn xảy ra ngay sau khi tôi nhập một từ sai chính tả, và trình mô phỏng cố gắng hiển thị gạch chân màu đỏ.

Tôi cũng đã thử chạy với NSZombieEnabled và tôi không thấy bất kỳ điều gì trong nhật ký về thư được gửi tới zombie.

Ứng dụng của tôi khá đơn giản - một ứng dụng dựa trên tab có bộ điều khiển điều hướng cho từng tab trong số 5 tab của tôi. Sau đó, 5 bộ điều khiển chế độ xem tùy chỉnh của tôi được đặt làm bộ điều khiển gốc của mỗi bộ điều khiển điều hướng. Tôi hiện đang có một trong các bộ điều khiển xem tùy chỉnh của tôi tạo và trình bày bộ điều khiển phương thức. Tôi đã thử bình luận ra bất kỳ cuộc gọi phát hành trong bộ điều khiển xem cha mẹ, để avail không có.

Điều tôi không hiểu là đối tượng đồ họa nào đang cố gắng truy cập có thể đã được phát hành (hoặc không giữ lại) thuộc trách nhiệm của ứng dụng đối với việc quản lý bộ nhớ? Điều duy nhất có thể, trong tâm trí của tôi, là UITextView, và tôi đã cố gắng tuyên bố nó như là một tài sản với giữ lại, và thiết lập nó như là một lối thoát với Interface Builder. Tuy nhiên, tai nạn tương tự.

Bất kỳ trợ giúp nào được đánh giá cao !!!

+0

Cần biết thêm chi tiết: (1) Làm thế nào bạn thêm độ xem văn bản để "xem cơ bản"? Bạn có sử dụng Trình tạo giao diện hoặc bạn thêm nó theo chương trình không? (2) Nếu lập trình thì hãy đăng mã tạo/bổ sung. –

+0

Tôi đang sử dụng Trình tạo giao diện và UITextView được kết nối với ổ cắm được khai báo trong bộ điều khiển chế độ xem. Nó khá là nhiều. Một điều tôi đã không đề cập đến là bộ điều khiển xem được trình bày như một bộ điều khiển xem phương thức. Tôi chỉ cần làm theo mã mẫu của Apple trong các tài liệu cho "Modal View Controllers" để khởi tạo bộ điều khiển xem từ một ngòi, và trình bày nó một cách bình thường. Chế độ xem phương thức chứa UITextView, chỉ bị treo vì các lý do không xác định. – pmc255

+0

Chỉ ra rằng có một hình ảnh cụ thể gây ra sự cố. Khi hình ảnh cụ thể này được tải với [UIImage imageWithData: ...], các tương tác tiếp theo với UITextView dẫn đến việc gạch dưới chính tả dẫn đến sự cố. Điều này chỉ xảy ra với một hình ảnh, hình ảnh đó không có vẻ không đúng định dạng hoặc bất kỳ thứ gì. Tôi đã nộp lỗi này với Apple. – pmc255

Trả lời

2

EXC_BAD_ACCESS về cơ bản có nghĩa là bộ nhớ truy cập không được Ứng dụng của bạn sử dụng.Tôi đoán là bạn đang chỉnh sửa một biến hoặc truy cập vào một biến mà bạn đã phát hành. Nhận xét các bản phát hành của bạn và xem cách phát hành.

EDIT: Cũng có thể có nghĩa là bạn không giữ lại một biến cần phải có.

+0

Tôi chỉ gọi phát hành khi bộ điều khiển xem được dealloc'ed (và tôi đoán ngầm khi xem nó được dỡ bỏ), nhưng điều đó không xảy ra khi ứng dụng gặp sự cố. Nếu bạn nhìn vào dấu vết ngăn xếp, nó rõ ràng được gây ra bởi đồ họa/hình ảnh động liên quan đến mã. – pmc255

+0

Bạn cũng có thể không giữ lại đúng cách. Thật khó để nói với không có mã. Tôi sẽ không nhìn vào dấu vết ngăn xếp bởi vì ví dụ nếu nó được tự động phát hành nó có thể sụp đổ tại một điểm ngẫu nhiên hoặc một điểm mà nó yêu cầu truy cập vào một đối tượng không còn được giữ lại trong ruột của UITextField. Bạn cũng có thể ví dụ không được giữ lại chế độ xem đúng cách và khi bạn nhấp vào trường văn bản và cập nhật sẽ cập nhật chế độ xem và không giữ lại nó sẽ bị lỗi như của bạn. Khó nói nhưng tôi sẽ rất ngạc nhiên rằng nó không gây ra bởi hoặc phát hành quá sớm hoặc không giữ lại một ob – Rudiger

+0

Do UITextField hoặc đối tượng UIView của bộ điều khiển xem phương thức phải được giữ lại bằng tay? Đối tượng UIView luôn được giữ lại, vì nó được tham chiếu bởi cá thể UIViewController (hoặc lớp con của nó). Tôi đã tạo một số ứng dụng mẫu và không kết nối UITextField với ổ cắm và nó vẫn hoạt động tốt. Tôi đã đi trên một cuộc săn lùng với trí nhớ quản lý trong tâm trí (kể từ khi một vài người đã đề cập đến nó), nhưng tôi vẫn không thể tìm ra vấn đề. Xem bài đăng gốc của tôi để biết mã cập nhật. – pmc255

1

Tôi đã gặp phải lỗi tương tự này. Tôi đang sử dụng chế độ xem văn bản trong chế độ xem bảng và điều này không xảy ra khi tính năng tự động sửa được đặt thành tắt.

+0

Điều này chỉ xảy ra khi bạn tải một hình ảnh với UIImage? Tôi chỉ có thể tạo lại lỗi này khi tải ảnh * cụ thể * bằng UIImage. Chỉ hình ảnh cụ thể này làm cho chế độ xem văn bản bị lỗi. – pmc255

+0

Không chắc chắn ý bạn là gì. Tôi có một số hình ảnh ở nơi khác trên trang, bạn có nói rằng những hình ảnh đó đang can thiệp vào textview bằng cách nào đó không? – unjust

0

Tôi gặp sự cố này - tôi đã đặt TextView của mình thay vì màu văn bản ngu ngốc! Vì vậy, tôi có điều này:

self.myTextView = [UIColor lightGrayColor]; 

thay vì điều này:

self.myTextView.textColor = [UIColor lightGrayColor];