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方法成為訪問單例的方式,并將其記錄為在標頭中獲取單例實例的方式。在絕大多數情況下,這就是您所需要的。

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

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