2013-06-08 48 views
8

Tôi cần sử dụng hiệu ứng xước cho trò chơi của mình. đây là một mã ví dụ năm trước.Tai nạn hiệu ứng thẻ cào ios

https://github.com/oyiptong/CGScratch

Nó hoạt động tốt, nhưng khi tôi sử dụng nó cùng với bộ điều khiển chuyển hướng, nó bị treo.

Dự án của tôi sử dụng ARC, tôi gắn cờ tệp là -fno-objc-arc. Đây là mã nguồn:

https://github.com/lifesaglitch/ScratchWithError

nó bị treo khi tôi đẩy bộ điều khiển xem, sau đó bật, sau đó nhập lại.

Edit:

Khi bạn chuyển đổi tất cả để arc, và cờ điều khiển xem có sử dụng quan điểm đầu như -fno-objc-arc, nó hoạt động. Nhưng khi bạn gắn cờ chế độ xem đầu dưới dạng -fno-objc-arc thay vào đó, nó sẽ lại bị treo. Dự án của tôi sử dụng vòng cung và tôi không nghĩ rằng tôi có thể chuyển đổi bộ điều khiển xem của riêng tôi thành -fno-objc-arc.

Chỉnh sửa 2:

tôi sửa đổi mã khởi tạo để:

scratchable = CGImageRetain([UIImage imageNamed:@"scratchable.jpg"].CGImage); 

nó không sụp đổ nữa, nhưng có một rò rỉ bộ nhớ. và CGImageRelease đã được gọi một lần trong phương thức dealloc.

+0

Nếu không có nhật ký sự cố hoặc báo cáo từ các lãnh sự không thể nói như thế nào để sửa chữa đoạn code để nó thắng 't sụp đổ, trừ khi ai đó có một quả cầu pha lê. –

+0

@CodeMonkey tin tưởng tôi, một số lần lỗi ứng dụng không có nhật ký – OMGPOP

+0

Điều đó là hợp lý, nhưng mã bạn đã đăng là tốt, trừ khi bạn có thể tạo lại sự cố và xem nhật ký gần như không thể xác định điểm xảy ra sự cố. –

Trả lời

4

Sử dụng CGImageCreateCopy.

Lý do cho điều này là bạn gửi một thông cáo tới CGImageRef tại dealloc của bạn, nhưng nếu bạn kiểm tra các đối tượng thực tế CGImage bạn sẽ thấy rằng nó trỏ đến cùng địa chỉ bộ nhớ mỗi lần (tôi đoán nó là một phần của tối ưu hóa của Apple, vì vậy nó giống như bạn sẽ có một đối tượng static UIImage và tham chiếu của nó CGImage).

Vì vậy, trong bạn initWithFrame: bạn sẽ nhận được của bạn scratchable như thế này:

UIImage *sci = [UIImage imageNamed:@"scratchable.jpg"]; // This guy is always the same 
scratchable = CGImageCreateCopy(sci.CGImage); 

PS: Bạn đã có một rò rỉ thực tế với pixels, vì vậy bạn cũng cần một CFRelease(pixels);

tôi kiểm tra, phân tích và đo mã và nó có vẻ là OK ngay bây giờ.

Here is also a link to the fixed project (Tôi cũng đã đặt bộ điều khiển điều hướng và nút để nhấn/bật) - và sử dụng ARC tất nhiên.

+0

cũng giải thích thưa ông. – OMGPOP

0

Trong AppDelegate.m

[window addSubview:viewController.view]; 

Bạn thay vào đó nên thay thế nó bằng:

[window setRootViewController:viewController]; 
Các vấn đề liên quan