2017-10-31 15 views
6

Tôi đang tạo một trò chơi cần phát nhạc. Để làm cho mã của tôi dễ quản lý hơn, tôi muốn tạo một NSObject để xử lý các âm thanh (như mờ dần, phát âm thanh trong danh sách phát, v.v.). Tôi có mã này:Phát NSSound trong NSObject (Ứng dụng Mac với Mục tiêu-C)

NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO]; 
[music play]; 

Mã này hoạt động khi tôi đặt nó trong tệp AppDelegate.m nhưng không hoạt động khi tôi đặt nó trong Lớp NSObject mới.

Mã trong NSObject Class (tên Music):

- (void)playMusic:(NSString *)fileName ofType:(NSString *)type 
{ 
    NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO]; 
    [music play]; 

    NSLog(@"Works!"); 
} 

Tôi gọi phương thức với mã này trong AppDelegate.m:

[[[Music alloc] init] playMusic:self.fileName ofType:self.extension]; 

Khi điều này được thực hiện nó log "hoạt động! " có nghĩa là mã được thực hiện.

Vì vậy, mã chính xác tương tự hoạt động trong AppDelegate nhưng không hoạt động trong Lớp NSObject. Có ai biết nếu chơi một NSSound trong một lớp NSObject thậm chí có thể (nếu không, tại sao?), Và nếu như vậy làm thế nào để chỉnh sửa mã để nó hoạt động? Nó sẽ làm cho mã của tôi trông ít hơn rất nhiều lộn xộn;)

+2

Bạn có chắc chắn rằng bạn giữ lại 'dụ Music' của bạn, nghĩa là nó chưa được phát hành tại thời gian khi chơi nhạc nên bắt đầu? –

+0

@ ReinhardMänner Tôi không biết thực sự. Tôi thực sự không biết nhiều về việc giữ lại và phát hành. Làm thế nào tôi có thể chắc chắn rằng nó đã không được phát hành? – Developer

+0

Tôi không nghĩ rằng nó quan trọng khi bạn đặt mã; tuy nhiên nó có thể là vấn đề trong bối cảnh bạn chạy nó. Khi trong appdelegate, có lẽ mã của bạn chạy trong bối cảnh thread chính. Vì vậy, có lẽ bạn nên đặt mã này trong một khối và chạy nó trong chủ đề chính để xem nếu nó làm cho bất kỳ sự khác biệt. – manishg

Trả lời

1

Hãy thử gọi phương pháp trên chủ đề chính,

dispatch_async(dispatch_get_main_queue(), ^{ 
    // do work here 
}); 
Các vấn đề liên quan