簡體   English   中英

Objective-C私有方法困境

[英]Objective-C Private Method Dilemma

我知道Objective-C不支持真正的私有方法。 我目前正在做的聲明'私有'方法是在類.m文件中添加以下內容:

@interface MyClass() 

- (void) privateMethodName;

@end


問題:

如果我現在添加一個子類,並想使用這個'私有'方法,我不能! 我收到錯誤:

用於實例消息的接收器類型“SubClassName”未聲明具有選擇器“privateMethodName”的方法


因此,如果我不希望非子類能夠訪問此方法,但確實希望子類能夠,我該怎么辦? 實現目標的最佳/正確方法是什么?

您可以將“受保護”界面與公共界面分開。 在主標頭中,只需聲明公共方法:

MyMagicThingy.h

@interface MyMagicThingy: NSObject

- (void) publicMethod;

@end 

然后,有一個帶有受保護方法的附加標頭:

MyMagicThingy+Protected.h

#import "MyMagicThingy.h"

@interface MyMagicThingy (Protected)

- (void) protectedMethods;

@end

您不能在Objective C中擁有“真正的”私有/受保護/公共方法(如:編譯器將強制執行訪問規則。所有方法都是公共的)。 你必須遵守慣例。

你所描述的實際上是一種受保護的方法。 克服這種情況的一種方法是:Ivars可以聲明為@public@protected@private 您可以聲明一個受保護的幫助程序實例來限制對派生實例的訪問,派生實例然后通過保存它的對象回調。

在某些情況下,另一種替代方法是使子類寫入接口,然后保持您的實現私有。

有時,您只需要記錄“不要這樣做,除非您不是子類”,因為它不是語言的一部分。 在這種思維模式中,一個聲明一類受保護方法的單獨標題是我最喜歡的標題之一。 它很好地隱藏在客戶端之外,但是可以通過顯式包含使子類可見--Dirk同時提供了一個這樣的例子,檢查出來。

最后,如果您對ObjC ++感到滿意,C ++會提供此控件,因此您可以非常自由地混合模式和可見性。

首先是最重要的

你不能讓任何人無法調用在Objective-C中對象上實現的任何方法(至少不會燒掉幾十個剃須刀,使得Yaks的防風雨性能降低)。

只是不要調用未在公共頭文件中聲明的方法作為約定(這就是你正在做的事情)。

第二

上段中的public一詞就是訣竅:

在Objective-C中(至少在其當前版本中),可以使用您在帖子中描述的技術在類連續中定義任何數量的頭文件的類接口。

Apple框架類的一個這樣的例子就是UIGestureRecognizer及其獨立的子類化頭UIGestureRecognizerSubclass.h


PS:
您看到的錯誤是使用ARC,因此您的運行時肯定是最近的,甚至可以使用多個實現文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM