2

お互いのプロパティにアクセスできるようにしたいクラスが2つありますが、それらのプロパティに他の場所からアクセスしたくありません。これを行う方法はありますか?サブクラス化によってこれを達成する唯一の方法はありますか?2つのクラスの間に「特別な」関係を確立する方法はありませんか?

4

5 に答える 5

12

私があなたの質問を理解するならば、あなたは事実上、継承によって無関係であるクラスAとクラスBに、公に宣伝されているよりも多くの内面を認識させたいですか?

Aには、innardsForBBのインスタンスのみがアクセスする必要があるというプロパティがあります。クラス拡張を使用して、Aへの非公開インターフェースを宣言できます。


ああ

@interface A:NSObject
... regular class goop here ...
@end


A-Private.h

@interface A()
@property(nonatomic, strong) Innards *innardsForB;
@end


午前

#import "A.h"
#import "A-Private.h"

@implementation A
// because "A-Private.h" is #import'd, `innardsForB` will be automatically @synthesized
...
@end


Bm

#import "B.h"
#import "A-Private.h"

@implementation B
...
- (void)someMethod
{
     A *a = [self someASomewhere];
     a.innardsForB = [[Innards alloc] initForMeaning:@(42)];
}
于 2013-03-26T14:46:54.433 に答える
3

プロトコルはその目的のために設計されています。サードパーティのクラスによるプロトコルの実装または使用を停止することはできません。これらのメソッドはパブリックですが、必ずしもパブリックインターフェイスの一部ではありません。

于 2013-03-26T14:15:40.230 に答える
1

オブジェクト間の通信:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html

于 2013-03-26T14:20:19.557 に答える
-1

classAがclassBのプロパティにアクセスし、classCがClassBでclassAの参照を宣言し、ClassBで宣言しないようにしたいのですが。

例 :

@interface ClassA
@property (nonatomic, strong) UILabel *label1;
@end

#import "ClassB.h"
#import "ClassA.h"  // To access public properties and all methods declared in ClassA.h

@implementation ClassB 

ClassA *classA = ....;
classA.label1.text = ...;

@end 

この例から、ClassBはClassAのすべてのパブリック(CalssA.hで宣言)プロパティとメソッドにアクセスできます。

デリゲートを使用してこれを行うこともできます。

于 2013-03-26T14:30:26.493 に答える
-8

obj-cではプロパティが保護されます。つまり、継承によってのみプロパティにアクセスできます。

@interface A : NSObject{
    NSObject* prop;
}
@end

@implementation A
@end

@interface B : A
@end

@implementation B
- (void)protected{
    self->prop; // yep
}
@end

@interface XXX : NSObject
@end

@implementation XXX

- (void)test{
    A* a = [[A alloc] init];
    a->prop; // wrong, will not compile
}

@end

メソッドを介して非表示のプロパティにアクセスする場合は、実装で非表示のカテゴリを使用するか、ブリッジを使用できます。しかし、2つのクラス間に「特別な」関係を確立する方法はありません。ただし、この関係をコード設計に適用することはできます。

于 2013-03-26T14:29:25.523 に答える