OC学习篇之--- class关键字的作用以及 include和 import的区别

               

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题:


一、#import和#include的区别

当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误

但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了


二、关键字@class的作用

在来看一下OC中的关键字@class的作用,在看他的作用之前,先来看一个问题:

现在有一个课程类Classes和学生类Student,他们两之间需要相互引用(导入)。直接看代码比较直接:

Classes.h

////  Classes.h//  08_@class////  Created by jiangwei on 14-10-11.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>#import "Student.h"//不会将Student.h拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中任何信息(哪些属性和方法)//@class Student;@interface Classes : NSObject{    @public    Student *_student;}- (void)t1;@end

导入Student.h头文件


Classes.m

////  Classes.m//  08_@class////  Created by jiangwei on 14-10-11.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import "Classes.h"//#import "Student.h"@implementation Classes- (void)t1{    [_student work];}@end


在来看一下Student类

Student.h

//  Student.h//  08_@class////  Created by jiangwei on 14-10-11.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>#import "Classes.h"@interface Student : NSObject{    Classes *_classes;}- (void)work;@end
同样的也导入Classes.h头文件


Student.m

////  Student.m//  08_@class////  Created by jiangwei on 14-10-11.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import "Student.h"@implementation Student- (void)work{    NSLog(@"work");}@end


在来看一下测试代码:

main.m

////  main.m//  08_@class////  Created by jiangwei on 14-10-11.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>#import "Classes.h"#import "Student.h"//Classes和Student相互导入会出现问题//这时候我们就可以使用@class解决这样的问题//我们一般在.h文件中使用@class,因为在.h文件中一般是不会使用类的属性和方法的//在.m文件中可以导入.h文件int main(int argc, const char * argv[]) {    @autoreleasepool {        Classes *cls =[[Classes alloc] init];        Student *stu = [[Student alloc] init];        cls->_student = stu;        [cls t1];            }    return 0;}
这里有一个问题注意一下:我们看到了这里是如何使用Classes中的属性_student的,因为在Classes类中属性_student是@public的,所以可以直接使用,用的是箭头符号,和C/C++中的指针变量调用差不多。记住了,这里就说到了如何直接访问一个类中的@public修饰符的属性变量


我们编译运行:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值