2015-10-05 54 views
0

後,此高度相關的其他問題有關從斯威夫特訪問ObjC回調。但是我的研究還沒有取得成果。目標C座是零轉讓

任何人都可以看到,如果我有可能做一些錯誤的語法明智的嗎?

謝謝!

我已經宣佈了下述目標C回調爲:

#import <UIKit/UIKit.h> 

@class KxMovieDecoder; 

typedef void (^KX_FIRST_FRAME_CALLBACK)() ; 


extern NSString * const KxMovieParameterMinBufferedDuration; // Float 
extern NSString * const KxMovieParameterMaxBufferedDuration; // Float 
extern NSString * const KxMovieParameterDisableDeinterlacing; // BOOL 

@interface KxMovieViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> { 
    KX_FIRST_FRAME_CALLBACK firstFrameLoaded; 
} 

+ (id) movieViewControllerWithContentPath: (NSString *) path 
           parameters: (NSDictionary *) parameters; 

@property (readonly) BOOL playing; 
@property (nonatomic, copy) KX_FIRST_FRAME_CALLBACK firstFrameLoaded; 

- (void) play; 
- (void) pause; 

@end 

當我分配給它的SWIFT代碼,它仍然是分配後無:

Image showing debug

public func startViewing() -> UIViewController { 

     kxMoviePlayer = KxMovieViewController.movieViewControllerWithContentPath(rtspURL, parameters: nil) as? KxMovieViewController 
     kxMoviePlayer!.firstFrameLoaded = { 
      self.onFirstFrameOfVideo() 
     } 
+1

Objective-C的實現是什麼樣的?只是'@ synthesize'語句?此外,您的代碼目前看起來可能會創建一個保留週期。如果自己保留了kxMoviePlayer,你可以考慮在你的塊中添加一個捕獲列表:'kxMoviePlayer!.firstFrameLoaded = {[unowned self]() - > self.onFirstFrameOfVideo()}中的void。這不會導致它成爲'零'。 –

+0

感謝您的提示,我會的。 –

回答

1

只要將一個空白的項目與類似的設置放在一起,它工作得很好。但有幾個問題。

您的意思是同時擁有一個實例變量和一個名爲firstFrameLoaded財產?您的自動合成屬性不使用實例變量,而是使用自動生成的_firstFrameLoaded實例變量。也許這是混淆的根源,你打算在i-var前加一個下劃線?

任何回調屬性的原因是copy而不是指示strongweak引用?

+0

沒有理由複製,只是從相關問題上的另一個答案複製,試圖讓它工作。你的推薦意見是什麼?我原本是強壯的,非原子的。是的,讓我檢查下劃線! –

+0

謝謝,是的,我犯的錯誤是實例變量 –

+1

上的缺失_那麼它更多是出於好奇,因爲我不確定更大的圖片是什麼。通常回撥或委託會有一個弱引用,因爲調用者的責任不在於管理被調用者的生活。我會在非回調的情況下看到一個副本,在這些情況下,您正在向任務添加額外的處理,但是這裏的語義似乎並不正確。老實說,不知道副本如何與自引用閉包交互。看起來像一個保留週期。雖然可能是錯誤的副本。 –