Objective-C不帶加減號的方法實(shí)例
前言
在Oc中,方法分為類方法和實(shí)例方法。
前置加號(+)的方法為類方法,這類方法是可以直接用類名來調(diào)用的,它的作用主要是創(chuàng)建一個實(shí)例。有人把它稱為創(chuàng)建實(shí)例的工廠方法。
前置減號(-)的方法為實(shí)例方法,必須使用類的實(shí)例才可以調(diào)用的。
但看別人代碼過程中,還會發(fā)現(xiàn)一種,不帶加減號的方法。
@implementation MyViewController void foo(){ printf("msg from foo..."); } - (void)loadView { [super loadView]; foo(); } @end
這種是混搭的 C 代碼。
當(dāng)然當(dāng) C 方法寫在 @implementation 內(nèi)也是可以的,編譯器會正確地處理。因?yàn)?C 方法嚴(yán)格來說不隸屬于類,好的做法是始終寫在類實(shí)現(xiàn)的外部。
void foo(){ printf("msg from foo..."); } @implementation MyViewController - (void)loadView { [super loadView]; foo(); } @end
C 中獲取 Objective-C 的數(shù)據(jù)
但如果你以為將 C 代碼寫在 @implementation 內(nèi)部就可以獲取到類里面的數(shù)據(jù),那是不現(xiàn)實(shí)的。
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 中便有了一個對象的引用,數(shù)據(jù)就可以正常獲取了。
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
相關(guān)資源
Mixing C functions in an Objective-C class
accessing objective c variable from c function
總結(jié)
到此這篇關(guān)于Objective-C不帶加減號方法的文章就介紹到這了,更多相關(guān)Objective-C不帶加減號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 中類對象類型的轉(zhuǎn)化的實(shí)例詳解
這篇文章主要介紹了C++ 中類對象類型的轉(zhuǎn)化的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08c++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用
如果拷貝構(gòu)造函數(shù)中的參數(shù)不是一個引用,即形如CClass(const CClass c_class),那么就相當(dāng)于采用了傳值的方式(pass-by-value),而傳值的方式會調(diào)用該類的拷貝構(gòu)造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構(gòu)造函數(shù)。因此拷貝構(gòu)造函數(shù)的參數(shù)必須是一個引用2013-07-07VC List Control控件如何刪除選中的記錄實(shí)例詳解
這篇文章主要介紹了VC List Control控件如何刪除選中的記錄實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++實(shí)現(xiàn)LeetCode165.版本比較)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode165.版本比較),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07用C++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法
下面小編就為大家?guī)硪黄肅++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04