3 回答

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ù)情況下,這就是您所需要的。

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”中(我想)。

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個贊
Apple已開始在其頭文件中使用以下命令禁用init構(gòu)造函數(shù):
- (instancetype)init NS_UNAVAILABLE;
這在Xcode中正確顯示為編譯器錯誤。具體來說,這是在其幾個HealthKit頭文件中設(shè)置的(HKUnit是其中之一)。
- 3 回答
- 0 關(guān)注
- 831 瀏覽
添加回答
舉報(bào)