【问题标题】:Objective-C: Accessing a property of another classObjective-C:访问另一个类的属性
【发布时间】: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 是不可变的,当您“更新”一个时,您实际上将其替换为具有不同地址的新的。

标签: objective-c ios


【解决方案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,对孩子放轻松。我的意思是,我们在某些时候都是初学者(相信我,我在这里编程的早期有一些非常尴尬的问题/答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2013-10-30
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多