Objective-C不帶加減號的方法實例
前言
在Oc中,方法分為類方法和實例方法。
前置加號(+)的方法為類方法,這類方法是可以直接用類名來調用的,它的作用主要是創建一個實例。有人把它稱為創建實例的工廠方法。
前置減號(-)的方法為實例方法,必須使用類的實例才可以調用的。
但看別人代碼過程中,還會發現一種,不帶加減號的方法。
@implementation MyViewController void foo(){ printf("msg from foo..."); } - (void)loadView { [super loadView]; foo(); } @end
這種是混搭的 C 代碼。
當然當 C 方法寫在 @implementation 內也是可以的,編譯器會正確地處理。因為 C 方法嚴格來說不隸屬於類,好的做法是始終寫在類實現的外部。
void foo(){ printf("msg from foo..."); } @implementation MyViewController - (void)loadView { [super loadView]; foo(); } @end
C 中獲取 Objective-C 的數據
但如果你以為將 C 代碼寫在 @implementation 內部就可以獲取到類裡面的數據,那是不現實的。
MyViewController.h
@interface MyViewController () @property NSString *someStr; @end
MyViewController.m
@implementation MyViewController // void foo() { printf(self.someStr); } // 🚨 Use of undeclared identifier '_someStr' void foo() { printf(_someStr); } // 🚨 Use of undeclared identifier '_someStr' - (void)loadView { [super loadView]; self.someStr = @"some string..."; foo(); } @end
正確的做法是將 Objective-C 的對象傳遞給 C 代碼,這樣在 C 中便有瞭一個對象的引用,數據就可以正常獲取瞭。
MyViewController.h
@interface MyViewController : UIViewController @property NSString *someStr; - (void)myObjcMethod; @end
MyViewController.m
void foo(MyViewController* obj) { printf("%s\n", [obj.someStr UTF8String]); [obj myObjcMethod]; } @implementation MyViewController - (void)loadView { [super loadView]; self.someStr = @"some string..."; foo(self); } - (void)myObjcMethod { NSLog(@"msg from my objc method"); } @end
相關資源
Mixing C functions in an Objective-C class
accessing objective c variable from c function
總結
到此這篇關於Objective-C不帶加減號方法的文章就介紹到這瞭,更多相關Objective-C不帶加減號內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- IOS開發Objective-C Runtime使用示例詳解
- Objective-C 入門篇(推薦)
- 詳解React Native與IOS端之間的交互
- ios使用NSProxy實現消息轉發
- 詳解Objective C 中Block如何捕獲外部值