20150624_OC之@class关键字

本文详细介绍了 Objective-C 中 @class 和 #import 的使用方式,阐述了它们在类引用上的区别,并通过实例展示了如何避免循环引用的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值