亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

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

3 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

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


您可以做的是在調用NSInternalInconsistencyException您的-init方法時拋出:


- (id)init {

    [self release];

    @throw [NSException exceptionWithName:NSInternalInconsistencyException

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

                                 userInfo:nil];

    return nil;

}

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


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


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


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

TA貢獻1783條經驗 獲得超4個贊

NS_UNAVAILABLE

- (instancetype)init NS_UNAVAILABLE;

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


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


- (instancetype)init NS_SWIFT_UNAVAILABLE;

unavailable

將unavailable屬性添加到標頭,以在每次調用init時生成編譯器錯誤。


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

編譯時錯誤


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


-(instancetype) __unavailable init;  

doesNotRecognizeSelector:

使用doesNotRecognizeSelector:提出一個NSInvalidArgumentException。“只要對象收到無法響應或轉發的aSelector消息,運行時系統就會調用此方法?!?/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]因為該對象已經被alloc吃掉而需要。使用ARC時,編譯器會為您調用它。無論如何,當您有意停止執行時,不必擔心。


objc_designated_initializer

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


-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;

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


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

TA貢獻1898條經驗 獲得超8個贊

Apple已開始在其頭文件中使用以下命令禁用init構造函數:


- (instancetype)init NS_UNAVAILABLE;

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


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 822 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號