Objective-C:访问另一个类的属性

Posted

技术标签:

【中文标题】Objective-C:访问另一个类的属性【英文标题】:Objective-C: Accessing a property of another class 【发布时间】:2012-12-14 22:17:45 【问题描述】:

假设我有两个类(ClassA,ClassB)

ClassA.h

@interface ClassA : SomeSuperClass

@property (some Attributes) ClassB *classB;
@property (some Attributes) NSString *someString;

@end

现在我的问题:

我想访问 classB 实例中的 NSString someString。实现这一目标的最佳方法是什么? 我正在考虑两种解决方案:

在 classB 中创建一个协议,让 classA 响应这个协议。此协议中的唯一方法是访问/更改此字符串。

我想出的第二个解决方案是在创建classB的实例后将此字符串作为参数,然后classB可以存储对它的引用并可以随时更改它。

这两种解决方案对我来说似乎都有效(没有测试它,只是假设它),但在我看来它们似乎有点矫枉过正(尤其是第一个)

请告诉我最好的方法,谢谢。

【问题讨论】:

您能提供一个ClassB的示例接口吗?就像 CodaFi 建议的那样,弱引用应该没问题。只要你有类似的东西: \@property (nonatomic, retain) NSString *someString;在您的 .h 文件中定义,并在您的 .m 文件中定义 \@synthesize someString (以及任何覆盖),您应该是金色的。我认为;-) 请注意,您不能“存储引用”到字符串然后更改它并期望更改传播到您获得引用的位置。 NSSting 是不可变的,当您“更新”一个时,您实际上将其替换为具有不同地址的新的。 【参考方案1】:

如果您对 B 的父级 (A) 进行了弱引用,那么您可以安全地访问它的属性,而无需过度杀伤或创建保留循环。

@interface ClassA : SomeSuperClass

@property (some Attributes) ClassB *classB;
@property (some Attributes) NSString *someString;

@end


@implementation

-(id)init 
    if (self = [super init]) 
        _classB = [[ClassB alloc]initWithParent:self];
    


@end

@class ClassA;
@interface ClassB : SomeSuperClass

@property (nonatomic, weak) ClassA *classA;

-(id)initWithParent:(ClassA*)parent;

@end

#import "ClassA.h"
@implementation 

-(id)initWithParent:(ClassA*)parent 
    if (self = [super init]) 
        _classA = parent;
        NSLog(@"%@", self.classA.someString); //perfectly legal
    


@end

【讨论】:

那我还是要把ClassA作为参数传给classB吧? 感谢您的快速回复。 @c2programming 没问题。弱引用很棒! 这个问题每周至少被问一次,并且在一年中的某些时候每天被问到。请在提问前努力自己寻找答案。 @HotLicks Aw,对孩子放轻松。我的意思是,我们在某些时候都是初学者(相信我,我在这里编程的早期有一些非常尴尬的问题/答案)。

以上是关于Objective-C:访问另一个类的属性的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中,如何设置属性的属性,即设置为另一个类属性的类?

Objective-C:访问继承类中的私有属性

在 Swift 3 的值类型中访问 Objective-C 类别的属性(关联参考)

在 Swift 3 的值类型中访问 Objective-C 类别的属性(关联参考)

访问同一类的另一个对象的受保护属性的方法

OC类属性了解一下-class作为属性修饰符