标签:
OC中的.h文件, 是类的声明文件,用来声明函数(方法),变量
OC中的.m文件,是类的实现文件,用来实现.h中声明的函数(方法)
类的声明使用:@interface ——@end
如果在.m文件中使用@interface----@end称为类扩展,一般是私有扩展
类的实现使用:@implementation——@end
在.h中声明的所有方法作用域都是public类型的,不能更改
成员变量的作用域有三种:
- @public 全局都可以访问
- @protected 只能在类内部和子类中访问(默认是protected)
- @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引入
两种方式的区别:
- #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器A.h文件中的B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
- 使用@class方式由于只需要知道被引用类的名称就可以了,而在实现类由于要用到被引用类中得实体变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件
- 如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这中问题了
OC----初识
标签:
原文地址:http://www.cnblogs.com/hqzxbb/p/4383755.html