在保持对属性的访问的同时打破循环引用(Objective-c)

时间:2010-02-02 05:07:07

标签: objective-c

我有两个类(Test1Test2),每个类都有一个属性(分别为test2test1)指向另一个类的实例。这意味着Test1.m必须导入Test2.h,而Test2.m必须导入Test1.h。 .h文件还必须具有前向声明。不幸的是,这意味着我无法使用点表示法访问test2test1的属性。我可以通过消息传递访问它们,但我应该能够使用任何一种表示法。我该如何解决这个问题?

相关

测试1

//Test1.h

@class Test2;

@interface Test1 : NSObject {
 Test2* test2;
 int a1;
}
@property (nonatomic, retain) Test2* test2;

-  (void)meth1;

@end

//Test1.m
#import "Test1.h"
#import "Test2.h"

@implementation Test1

@synthesize test2;

-  (void)meth1{
 test2.a2;//Request for member 'a2' in something not a structure or union
}

@end

的Test2

//Test2.h
#import <Foundation/Foundation.h>

@class Test1;

@interface Test2 : NSObject {
 Test1 *test1;
 int a2;
}

@property (nonatomic, assign) Test1* test1;

-  (void)meth2;

@end

//Test2.m
#import "Test2.h"
#import "Test1.h"

@implementation Test2

@synthesize test1;

-  (void)meth2{
 test1.a1;//Request for member 'a1' in something not a structure or union
}

@end

2 个答案:

答案 0 :(得分:3)

添加和合成a1&amp;的属性a2似乎有所帮助。

答案 1 :(得分:2)

如果你想在他们所属的课程之外访问a1和a2,我强烈建议将它们定义为属性。

但是,如果确实想要避免传递邮件,您可以在标题中将它们定义为公开:

@interface Test2 : NSObject {
 Test1 *test1;
 @public 
   int a2;
}

并像这样访问它们:

-  (void)meth1{
    test2->a2;
}