2013-07-13 28 views
23

Khi ứng dụng của tôi tải lần đầu tiên, tôi đặt thuộc tính rootViewController của UIWindow thành controllerA.Thay đổi rootViewController của UIWindow

Thỉnh thoảng trong ứng dụng của tôi, tôi chọn thay đổi rootViewController thành controllerB.

Vấn đề là đôi khi tôi thực hiện chuyển đổi lật trong controllerB, tôi thấy chế độ xem của controllerA đằng sau nó. Vì lý do nào đó, chế độ xem không bị xóa. Thậm chí còn đáng lo ngại hơn là sau khi đặt phương thức rootViewController sang controllerB, controllerA 's dealloc không bao giờ bị sa thải.

tôi đã cố gắng loại bỏ các subviews của UIWindow thủ công trước khi chuyển sang controllerB, mà giải quyết vấn đề gặp controllerA 's quan điểm trong nền nhưng controllerA' dealloc s vẫn không bao giờ được gọi. Có gì xảy ra ở đây ????

Táo tài liệu nói:

Gốc view controller cung cấp quan điểm nội dung của cửa sổ. Gán bộ điều khiển chế độ xem cho thuộc tính này (theo lập trình hoặc sử dụng Trình tạo giao diện) sẽ cài đặt chế độ xem của trình điều khiển chế độ xem làm chế độ xem nội dung của cửa sổ. Nếu cửa sổ có phân cấp chế độ xem hiện tại, các chế độ xem cũ sẽ bị xóa trước khi các chế độ xem mới được cài đặt.

CẬP NHẬT

Dưới đây là đoạn code của appdelegate tôi:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self showControllerA]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)showControllerA 
{ 
    ControllerA* a = [ControllerA new]; 
    self.window.rootViewController = a; 
} 

- (void) showControllerB { 
    ControllerB* b = [ControllerB new]; 
    self.window.rootViewController = b; 
} 
+0

Bạn có thể cung cấp mã cho phương thức 'application: didFinishLaunchingWithOptions:' trong ứng dụng của bạn không? – Cezar

+0

Câu hỏi ngu ngốc, nhưng bạn có đặt 'controllerA' thành nil khi bạn đẩy bộ điều khiển thứ hai không? Nếu không thì nó sẽ không dealloc. (Tôi giả sử bạn là) – Putz1103

+0

Tôi không bao giờ giữ một con trỏ đến controllerA vì vậy không chắc chắn những gì tôi sẽ thiết lập để nil. – aloo

Trả lời

11

Hóa ra có hai vấn đề riêng biệt. 1) Tôi đã có một chu kỳ giữ lại trong Controller A vì vậy nó đã không bao giờ nhận được dealloc'd. Thứ hai, để thay đổi bộ điều khiển chế độ xem gốc, trước tiên bạn phải xóa các cửa sổ phụ (mặc dù các tài liệu đề xuất cách khác)

1

Vấn đề có thể là trong việc thực hiện lại ControllerA hoặc ControllerB, họ có thể giữ lại 'ngã' trong đoạn code để ARC không thể tự động dealloc bạn ViewController. Bạn có thể gửi cho bạn thực hiện ControllerA và ControllerB không.

+0

Điều đó sẽ giải thích lý do tại sao dealloc không được gọi. Nhưng tại sao chế độ xem từ controllerA vẫn hiển thị phía sau controllerB. Không thay đổi bộ điều khiển chế độ xem gốc xóa các chế độ xem của controllerA khỏi cửa sổ? – aloo