OC----初识

OC中的.h文件, 是类的声明文件,用来声明函数(方法),变量
OC中的.m文件,是类的实现文件,用来实现.h中声明的函数(方法)
类的声明使用:@interface ——@end
                    如果在.m文件中使用@interface----@end称为类扩展,一般是私有扩展
类的实现使用:@implementation——@end
在.h中声明的所有方法作用域都是public类型的,不能更改
成员变量的作用域有三种:
  1. @public 全局都可以访问
  2. @protected 只能在类内部和子类中访问(默认是protected) 
  3. @private 只能在类内部访问
比java少了一种作用域:包权限作用域,原因很明显:OC没有包名的概念。
直接访问成员变量:对象->成员变量;
设置成员变量的作用域:
复制代码
@public 
int age;
int no;

@protected
float height;

@private
float weight;
复制代码

 

 
减号“-”声明   代表动态方法(对象方法)
加号“+”声明  代表静态方法(类方法)(所有对象可以直接引用,不需要创建新的对象)
 
在OC中凡是类型都用括号括住:例如(int)age;
声明中方法需要传递参数时,需要在方法后边加“:”一个冒号对应一个参数;
而且冒号“:”也是方法名的一部分;
传递两个参数:
-(void)setAge:(int)age andNo:(int)no;
//在.h文件中声明

 

其中andNo可以省略,它只是为了让方法名念起来通顺一点;
 
 
OC中利用指针返回对象:Student *stu=[Student alloc];
 
创建一个Student对象的方法:
//为student对象分配一个内存空间
Student *stu=[Student alloc];
//调用init动态方法初始化stu
stu=[stu init];

 

 
在开发中常用下边这种形式:
 
Student *stu=[[Student alloc] init];

 

 
访问公共成员变量:对象->成员变量;
 
点语法:
[student setAge:10]完全等价于 stu.age = 10;
int age = [stu age]完全等价于 int age = stu.age;
 
OC点语法的本质是方法调用,不是直接访问成员变量;
 
构造方法:
//自己声明一个构造方法
-(void)initWithAge:(int)age andNo(int)no;

 

实现构造方法:
复制代码
-(void)initWithAge:(int)age andNo:(int)no{
  if(self=[super init]{
    _age=age;
    _no=no;
    }
  return self;
}
复制代码

 

 
OC中字符串的表示:
char *s=“stu”//c语言中字符串的表示
NSString *str=“stu”//OC中字符串的表示

 

 
在java中this只能用在动态方法中,不能用在静态方法中
用this代表调用这个动态方法的对象
 
在OC中self既可以用在动态方法中,也可以用在静态方法中
self用在动态方法中:表示调用这个动态方法的对象(self代表“对象”)
self用在静态方法中:self表示的是当前方法的调用者,即当前的类(self代表“类”)
万变不离其宗:self代表者当前方法的调用者
 
如果直接把方法写在.m文件中,没有在.h文件中声明,那么这种方法就是私有方法
 
空指针和野指针
空指针:没有存储任何内存地址的指针就称为空指针
              空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0
野指针:不是空指针,是指向垃圾内存的指针
              即,当创建一个对象,用指针指向它,然后销毁了这个对象,但这时指针    
              还是指向这个已经销毁了的对象的内存地址,如果这时候利用指针去访问
              这个地址,就是非法访问,这就是野指针
              所以当销毁对象之后一般还要把指向对象的指针销毁或者赋值为空
 
@property语法:当编译器遇到@property时,会自动展开为getter和setter的声明
@property int age;
//编译器会自动展开为以下方法声明
-(void)setAge:(int)age;//set方法
-(void)age;//get方法

 

@synthesize语法:当编译器遇到@synthesize时,会自动展开为实现方法
                          并且@synthesize默认会去访问跟后边所写变量同名的变量
                          如果找不到同名变量,会自动生成一个私有的同名变量
复制代码
@synthesize int age;
//编译器会自动展开为如下get和set方法
-(void)setAge:(int)age{
   _age=age;
}
-(void)age{
 return _age;
}
复制代码

 

当然也可以这样写:
@property int age,no;//可同时property多个成员变量

 

 
在Xcode 4.5之后只用在.h文件中写@property语句就可以,不用在.m文件中写@synthesize就可以实现方法
 
如果没有在.m文件中没有写@synthesize 语句,(例如 @synthesize int age)
    那么编译器默认会访问(_成员变量)(例如 _age );
如果在.h文件中没有(_成员变量)(例如 _age ),
    那么编译器会默认帮我们创建私有成员变量(_成员变量)(例如 _age );
 
如何注释代码
#pragma mark - 【此处为分组名】:用此种方法代表对所写方法分组
#pragma mark 【方法注释】:用此种方法表示注释所写方法
 
 
@class语法
如果在.h文件中用到了某些类可以用@class声明,这样可以调高编译器性能
@class 语法:使用@class可以提高编译器性能
@class student // 这样写可以告诉编译器student是一个类,在声明的时候不用导入,可以调高编译性能
等到需要在.m文件中使用这个类所包含的方法的时候再去用import导入就可以了
 
当两个类互相包含的时候,例如A类要用到B类,B类也要用到A类,这样如果用import导入,会报错,所以我们在声明变量的时候一般用@class去说明A是一个类,B是一个类
只有在用到这个类的方法的时候再去用import导入
  • 如果是继承某个类,就要导入类的头文件
  • 如果只是定义成员变量、属性,用@class
 
通常引入一个类有两种方法:一种是通过#import方式引入;
                                               一种是通过@class引入
两种方式的区别:
  1. #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器A.h文件中的B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
  2. 使用@class方式由于只需要知道被引用类的名称就可以了,而在实现类由于要用到被引用类中得实体变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件
  3. 如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这中问题了

posted on 2015-04-01 14:25  hqzxB了个B  阅读(210)  评论(0编辑  收藏  举报