第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以在Objective-C中將-init方法設(shè)為私有?

是否可以在Objective-C中將-init方法設(shè)為私有?

POPMUISE 2019-10-24 11:07:19
我需要-init在Objective-C中隱藏(設(shè)為私有)我的類的方法。我怎樣才能做到這一點(diǎn)?
查看完整描述

3 回答

?
繁星點(diǎn)點(diǎn)滴滴

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個贊

與Smalltalk一樣,Objective-C也沒有“私有”與“公共”方法的概念。任何消息都可以隨時(shí)發(fā)送到任何對象。


您可以做的是在調(diào)用NSInternalInconsistencyException您的-init方法時(shí)拋出:


- (id)init {

    [self release];

    @throw [NSException exceptionWithName:NSInternalInconsistencyException

                                   reason:@"-init is not a valid initializer for the class Foo"

                                 userInfo:nil];

    return nil;

}

另一種選擇-在實(shí)踐中可能要好得多-盡可能使-init您的班級做出明智的選擇。


如果由于要“確保”使用單例對象而嘗試執(zhí)行此操作,請不要打擾。具體地,不與打擾“覆蓋+allocWithZone:,-init,-retain,-release”創(chuàng)建單身的方法。實(shí)際上,這幾乎是不必要的,只是增加了復(fù)雜性而沒有真正的明顯優(yōu)勢。


相反,只需編寫代碼,使您的+sharedWhatever方法成為訪問單例的方式,并將其記錄為在標(biāo)頭中獲取單例實(shí)例的方式。在絕大多數(shù)情況下,這就是您所需要的。


查看完整回答
反對 回復(fù) 2019-10-24
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個贊

NS_UNAVAILABLE

- (instancetype)init NS_UNAVAILABLE;

這是不可用屬性的簡短版本。它首先出現(xiàn)在macOS 10.7和iOS 5中。在NSObjCRuntime.h中將其定義為#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE。


有一個版本僅對Swift客戶端禁用此方法,而不對ObjC代碼禁用:


- (instancetype)init NS_SWIFT_UNAVAILABLE;

unavailable

將unavailable屬性添加到標(biāo)頭,以在每次調(diào)用init時(shí)生成編譯器錯誤。


-(instancetype) init __attribute__((unavailable("init not available")));  

編譯時(shí)錯誤


如果沒有理由,請輸入__attribute__((unavailable)),甚至__unavailable:


-(instancetype) __unavailable init;  

doesNotRecognizeSelector:

使用doesNotRecognizeSelector:提出一個NSInvalidArgumentException?!爸灰獙ο笫盏綗o法響應(yīng)或轉(zhuǎn)發(fā)的aSelector消息,運(yùn)行時(shí)系統(tǒng)就會調(diào)用此方法?!?/p>


- (instancetype) init {

    [self release];

    [super doesNotRecognizeSelector:_cmd];

    return nil;

}

NSAssert

使用NSAssert拋出NSInternalInconsistencyException并顯示一條消息:


- (instancetype) init {

    [self release];

    NSAssert(false,@"unavailable, use initWithBlah: instead");

    return nil;

}

raise:format:

使用raise:format:拋出自己的異常:


- (instancetype) init {

    [self release];

    [NSException raise:NSGenericException 

                format:@"Disabled. Use +[[%@ alloc] %@] instead",

                       NSStringFromClass([self class]),

                       NSStringFromSelector(@selector(initWithStateDictionary:))];

    return nil;

}

[self release]因?yàn)樵搶ο笠呀?jīng)被alloc吃掉而需要。使用ARC時(shí),編譯器會為您調(diào)用它。無論如何,當(dāng)您有意停止執(zhí)行時(shí),不必?fù)?dān)心。


objc_designated_initializer

如果您打算禁用init強(qiáng)制使用指定的初始化程序,則可以使用以下屬性:


-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;

除非myOwnInit內(nèi)部有其他初始化方法調(diào)用,否則將生成警告。下一個Xcode發(fā)布后,詳細(xì)信息將發(fā)布在“ 采用現(xiàn)代Objective-C”中(我想)。


查看完整回答
反對 回復(fù) 2019-10-24
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個贊

Apple已開始在其頭文件中使用以下命令禁用init構(gòu)造函數(shù):


- (instancetype)init NS_UNAVAILABLE;

這在Xcode中正確顯示為編譯器錯誤。具體來說,這是在其幾個HealthKit頭文件中設(shè)置的(HKUnit是其中之一)。


查看完整回答
反對 回復(fù) 2019-10-24
  • 3 回答
  • 0 關(guān)注
  • 831 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號