@Class关键字的使用及与#import的区别:
//
// ClassA.h
// IOS150624_ObjectiveC_@class关键字
//
// Created by PengJunlong on 15/6/24.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
//#import "ClassB.h" //会有循环链的存在,导致编译无法展开,(ClassA与ClassB相互引用)
@class ClassB;
@interface ClassA : NSObject
{
ClassB *_classB;
}
@property (copy,nonatomic)NSString *name;
- (void)setClassB:(ClassB *)classb;
- (void)printClassBInClassA;
@end
//
// ClassA.m
// IOS150624_ObjectiveC_@class关键字
//
// Created by PengJunlong on 15/6/24.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA
- (void)setClassB:(ClassB *)classb
{
_classB = classb;
}
- (void)printClassBInClassA
{
NSLog(@"name = %@",_classB.name);
}
@end
//
// ClassB.h
// IOS150624_ObjectiveC_@class关键字
//
// Created by PengJunlong on 15/6/24.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ClassA.h" //会有循环链的存在,导致编译无法展开,(ClassA与ClassB相互引用),引用了当前类的类型以及类中的方法
//@class ClassA; //只引用这个类的类型,不引用这个类的方法
@interface ClassB : NSObject
{
ClassA *_classA;
}
@property (copy,nonatomic)NSString *name;
- (void)setClassA:(ClassA *)classa;
- (void)printClassAInClassB;
@end
//
// ClassB.m
// IOS150624_ObjectiveC_@class关键字
//
// Created by PengJunlong on 15/6/24.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import "ClassB.h"
@implementation ClassB
- (void)setClassA:(ClassA *)classa
{
_classA = classa;
}
- (void)printClassAInClassB
{
NSLog(@"name = %@",_classA.name);
}
@end
//
// main.m
// IOS150624_ObjectiveC_@class关键字
//
// Created by PengJunlong on 15/6/24.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ClassA.h"
#import "ClassB.h"
//#import关键字,引用类的类型及类中定义的方法,若#import包含在头文件中可能会导致循环包含,需要用@class关键字来打断循环链
//@class关键字,只引用类的类型,不引用类中的方法.但是如果想使用类中的方法,需要在对应的.m文件中用#import包含
//@class只是告诉编译器存在这个类型,#import知道类内部信息全部
int main(int argc, const char * argv[]) {
@autoreleasepool {
ClassA *classa = [[ClassA alloc] init];
classa.name = @"类A";
ClassB *classb = [[ClassB alloc] init];
classb.name = @"类B";
[classb setClassA:classa];
[classa setClassB:classb];
[classb printClassAInClassB];
[classa printClassBInClassA];
}
return 0;
}