Làm cách nào để thiết lập NSZombieEnables trong Xcode 4?


456

Làm cách nào để thiết lập NSZombieEnabledCFZombieLevelthực thi trong Xcode 4?


1
bạn đang hỏi về Xcode 4?
Jehiah

8
Tại sao các tùy chọn như thế này không được bật theo mặc định nằm ngoài tôi ...
Daniel Magnusson

26
Bởi vì về cơ bản, nó ngăn chặn mọi giải phóng bộ nhớ thực sự, điều này dường như không phải là một ý tưởng tốt để bật theo mặc định.
Chetan

14
@Daniel Magnusson: đó là một điều sống còn nhất. Bằng cách phát triển với XCode không thân thiện nhưng khả thi, bạn sẽ có được các nhà phát triển tốt hơn. Đùa thôi.
Dan Rosenstark

3
@DanielMagnusson Tôi nghĩ rằng đây không phải là một ý tưởng tồi, AFAIK chế độ "Zombie" sẽ thay đổi mọi đối tượng thành một đối tượng ob đặc biệt để nó có thể phát hiện, khi nó được gửi tin nhắn. Vì vậy, việc bật "Chế độ Zombie" sẽ khiến không có đối tượng nào bị xử lý, vì vậy bạn chỉ nên sử dụng nó khi xử lý các lỗi đó.
Besi

Câu trả lời:


753

Trong Xcode 4.x nhấn

R

(hoặc nhấp chuột Menubar> Product> Scheme> Edit Scheme)

chọn tab "Chẩn đoán" và nhấp vào "Bật đối tượng Zombie":

Nhấp vào "Kích hoạt đối tượng Zombie"

Điều này biến các đối tượng được phát hành thành các phiên bản NSZombie in cảnh báo giao diện điều khiển khi được sử dụng lại. Đây là một trợ giúp gỡ lỗi làm tăng sử dụng bộ nhớ (không có đối tượng nào thực sự được phát hành) nhưng cải thiện báo cáo lỗi.

Một trường hợp điển hình là khi bạn giải phóng quá mức một đối tượng và bạn không biết đối tượng nào:

  • Với zombie: -[UITableView release]: message sent to deallocated instance
  • Không có zombie: EXC_BAD_ACCESS

Cài đặt Xcode này bị bỏ qua khi bạn lưu trữ ứng dụng để gửi App Store. Bạn không cần phải chạm vào bất cứ điều gì trước khi phát hành ứng dụng của bạn.

Nhấn Rcũng giống như chọn Sản phẩm> Chạy trong khi vẫn giữ Altphím.
Nhấp vào hộp kiểm "Kích hoạt đối tượng Zombie" giống như thêm thủ công "NSZombieEnables = YES" trong phần "Biến môi trường" của tab Đối số.


27
Cảm ơn - Tôi đã tự hỏi họ đã giấu các tùy chọn này ở đâu. Bây giờ tôi nhận ra đây là cùng một cửa sổ như trong menu 'Chỉnh sửa lược đồ'.
emp

1
Chỉ cần thêm vào điều này, thực hiện nó trong màn hình "Chạy" cũng đặt nó cho "Kiểm tra" nếu hộp "Sử dụng tùy chọn Chạy hành động" được chọn. Nếu bạn muốn làm điều đó chỉ với Thử nghiệm, hộp đó cần phải được bỏ chọn
Cameron

1
Cũng xin lưu ý rằng tùy chọn này xuất hiện trên Xcode 4.1 (phải không?)
phi

2
Trong XCode 5 (và các phiên bản mới hơn của 4 - 4.3.x chắc chắn, có thể sớm hơn), đây là CMD-<( CMD-SHIFT-comma) hoặcProduct -> Scheme -> Edit SCheme...
Olie

1
Tôi bị mắc kẹt trong vấn đề EXC_BAD_ACCESS kỳ lạ, ngay cả Zombie cũng bị bỏ qua, thật tuyệt nếu bạn có thể hướng dẫn tôi cho stackoverflow.com/questions/29210057/iêu
Anoop Vaidya

70

Câu trả lời của Jano là cách dễ nhất để tìm thấy nó .. một cách khác sẽ là nếu bạn nhấp vào thanh thả xuống lược đồ -> chỉnh sửa lược đồ -> tab đối số và sau đó thêm NSZombieEnables trong cột Biến môi trường và CÓ trong cột giá trị ...


57

Tôi thấy sự thay thế này thuận tiện hơn:

  1. Nhấp vào "Chạy thả xuống nút"
  2. Từ danh sách chọn Profile
  3. Chương trình "Dụng cụ" sẽ mở ra nơi bạn cũng có thể chọn Zombies
  4. Bây giờ bạn có thể tương tác với ứng dụng của mình và cố gắng gây ra lỗi
  5. Ngay sau khi xảy ra lỗi, bạn sẽ nhận được một gợi ý về thời điểm đối tượng của bạn được phát hành và do đó bị giải phóng.

Thây ma

Ngay khi phát hiện ra zombie, bạn sẽ nhận được một "Ngăn xếp Zombie" gọn gàng cho bạn biết khi nào đối tượng trong câu hỏi được phân bổ và nơi nó được giữ lại hoặc phát hành:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Ưu điểm so với việc sử dụng tab chẩn đoán của Lược đồ Xcode :

  1. Nếu bạn quên bỏ chọn tùy chọn trong tab chẩn đoán, sẽ không có đối tượng nào được giải phóng khỏi bộ nhớ.

  2. Bạn nhận được một ngăn xếp chi tiết hơn cho bạn thấy những phương thức mà đối tượng bị hỏng của bạn được phân bổ / giải phóng hoặc giữ lại.


1
Tùy chọn "Zombies" bị thiếu trong XCode 4 của tôi, tại sao?
Li Fumin

4
Đảm bảo bạn đang chọn iOS Simulator > Alltừ danh sách mẫu chính (Bạn chỉ có thể thực hiện việc này trong trình giả lập)
Besi

vì một số lý do .. nếu tôi chọn 'zombie', nó chỉ hiển thị phân bổ .. có ý tưởng nào tại sao không?
abbood

Đây là giải pháp tốt nhất. Đã giúp tôi rất nhiều :)
Michał Miszczyszyn

5

Trong Xcode 4.2

  • Tên dự án / Chỉnh sửa lược đồ / Chẩn đoán /
  • Kích hoạt hộp kiểm Zombie Đối tượng
  • Bạn đã hoàn tất


1

Ca cao cung cấp một tính năng thú vị giúp tăng cường đáng kể khả năng của bạn để gỡ lỗi các tình huống như vậy. Đây là một biến môi trường được gọi là NSZombieEnables, hãy xem video này giải thích việc thiết lập NSZombieEnables trong object-C


-1

Trong Xcode> 4.3:

Bạn bấm vào thanh thả xuống lược đồ -> chỉnh sửa lược đồ -> tab đối số và sau đó thêm NSZombieEnables trong cột Biến môi trường và CÓ trong cột giá trị.

Chúc may mắn !!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.