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 中,如何设置属性的属性,即设置为另一个类属性的类?
在 Swift 3 的值类型中访问 Objective-C 类别的属性(关联参考)