有没有办法允许某些类访问某些其他类的私有属性?

时间:2013-03-26 14:09:21

标签: ios objective-c scope encapsulation private-members

我有2个类,我希望能够访问其他属性,但我不希望从其他任何地方访问这些属性。有没有办法做到这一点?是通过子类化实现这一目标的唯一方法吗?有没有办法在两个班级之间建立“特殊”关系?

5 个答案:

答案 0 :(得分:12)

如果我理解你的问题,你有效地希望A类和B类(与继承无关)知道比公开宣传更多的内脏吗?

Say A有一个名为innardsForB的属性,只有B的实例才能访问。您可以使用类扩展来声明A的非公共接口。

<小时/> 的 A.H

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

<小时/> 的 A-Private.h

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

<小时/> 的 A.M

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

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

<小时/> 的 B.m

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

@implementation B
...
- (void)someMethod
{
     A *a = [self someASomewhere];
     a.innardsForB = [[Innards alloc] initForMeaning:@(42)];
}

答案 1 :(得分:3)

协议是为此目的而设计的。您无法阻止第三方类实现或使用协议。其中的方法是公共的,但不是公共界面的nessecarily部分。

答案 2 :(得分:1)

答案 3 :(得分:-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中声明)的权利和方法。

您也可以使用委托来执行此操作。

答案 4 :(得分:-8)

on 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

如果要通过方法访问隐藏属性,可以使用隐藏在实现中的类别或桥接。但是没有办法在两个类之间建立“特殊”关系。但您可以使用代码设计强制实现这种关系。