7

重複の可能性:
Objective-cの保護されたメソッド

プライベートプロパティを宣言する方法は簡単です。

.mファイルで宣言されている拡張子でそれを宣言します。

保護されたプロパティを宣言し、クラスとサブクラスからアクセスしたいとします。

これは私が試したものです:

//
//  BGGoogleMap+protected.h
//
//

#import "BGGoogleMap.h"

@interface BGGoogleMap ()
@property (strong,nonatomic) NSString * protectedHello;
@end

それはコンパイルです。それから私は追加しました:

#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap ()

-(NSString *) protectedHello
{
    return _
}

@end

問題が始まります。元の.mファイルの外にクラス拡張を実装できないようです。Xcodeは、そのブラケット内に何かを要求します。

私が行った場合

#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap (protected)

-(NSString *) protectedHello
{
    return _
}

@end

BGGoogleMap+protected.hで宣言された_protectedHelloのivarにアクセスできません

もちろん、拡張機能ではなく通常のカテゴリを使用できますが、それは保護されたプロパティを持つことができないことを意味します。

だから私は何をすべきですか?

4

3 に答える 3

7

Objective-Cプログラミング言語は次のように述べています。

クラス拡張は匿名カテゴリに似ていますが、宣言するメソッドを@implementation対応するクラスのメインブロックに実装する必要がある点が異なります。

したがって、クラス拡張のメソッドをクラスのmainに実装するだけで済みます@implementation。これが最も簡単な解決策です。

より複雑な解決策は、「保護された」メッセージとプロパティをカテゴリで宣言し、そのカテゴリのインスタンス変数をクラス拡張で宣言することです。カテゴリは次のとおりです。

BGGoogleMap+protected.h

#import "BGGoogleMap.h"

@interface BGGoogleMap (protected)

@property (nonatomic) NSString * protectedHello;

@end

カテゴリは保持するインスタンス変数を追加できないためprotectedHello、クラス拡張も必要です。

`BGGoogleMap_protectedInstanceVariables.h '

#import "BGGoogleMap.h"

@interface BGGoogleMap () {
    NSString *_protectedHello;
}
@end

@implementationコンパイラがファイル内のインスタンス変数を出力するように、メインファイルにクラス拡張子を含める必要があり.oます。

BGGoogleMap.m

#import "BGGoogleMap.h"
#import "BGGoogleMap_protectedInstanceVariables.h"

@implementation BGGoogleMap

...

@implementationまた、カテゴリメソッドがインスタンス変数にアクセスできるように、カテゴリファイルにクラス拡張子を含める必要があります。protectedHelloカテゴリでプロパティを宣言したため、コンパイラはsetterメソッドとgetterメソッドを合成しません。手で書く必要があります:

BGGoogleMap+protected.m

#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap (protected)

- (void)setProtectedHello:(NSString *)newValue {
    _protectedHello = newValue; // assuming ARC
}

- (NSString *)protectedHello {
    return _protectedHello;
}

@end

BGGoogleMap+protected.hプロパティを使用できるようにするには、サブクラスをインポートする必要がありprotectedHelloます。BGGoogleMap_protectedInstanceVariables.hインスタンス変数は基本クラスに対してプライベートとして扱われる必要があるため、インポートしないでください。ソースコードなしで静的ライブラリを出荷し、ライブラリのユーザーがサブクラス化できるようにしたい場合は、ヘッダーとヘッダーをBGGoogleMap出荷しますが、ヘッダーは出荷しません。BGGoogleMap.hBGGoogleMap+protected.hBGGoogleMap_protectedInstanceVariables.h

于 2012-12-01T04:05:11.780 に答える
2

私はあなたに他のことを言うことができればいいのですが、あなたはそれができません。詳細については、この質問を参照してください:Objective-Cの保護されたメソッド

于 2012-11-30T08:41:32.433 に答える
0

よくわかりません、あなたは何をしたいですか?オブジェクト指向の概念からのデータ抽象化のハッキングまたはクラッキング?

拡張機能は、プロパティを追加するために使用されます。次のようにプライベートプロパティを正常に追加しました

#import "BGGoogleMap.h"

@interface BGGoogleMap ()
@property (strong,nonatomic) NSString * protectedHello;
@end

これで何をしているの?

#import "BGGoogleMap+protected.h"

@implementation BGGoogleMap ()

-(NSString *) protectedHello
{
    return _
}

@end

クラスを拡張しましたが、同じクラスを再び実装しています!!! 二度!!! また、カテゴリには.hファイルのみが付属しています。自分で.mファイルを作成していると思いますが、これは受け入れられません。

プライベートプロパティにはクラスの外部からアクセスできません。基本クラスまたはサブクラスからのみアクセスできます。それがエラーです。

I can't implement class extension outside the original .m files it seems. 

はい、これはObjective-cの抽象化とデータ隠蔽です!!!

于 2012-11-30T10:06:06.813 に答える