1、@interface 、@ implementation
@interface表示类的声明
其声明的内容,对于调用者可见(类似于java的public);
@implementation表示类的实现
其声明的内容,仅自己可见(类似于java的private);
2、@class、#import
#import会包含这个类的所有信息,包括实体变量和方法;
@class只是简单的一个声明告编译器有这个类不让其报错,
那么.m中要用到引入的类的方法和属性时,不还是要#import头文件一次;
注意:
如果A依赖B,B又依赖A,如果全部使用import,编译会报错,应使用class;
3、#import的“”和<>
#import" " 是自己创建的文件;#import< > 是系统的文件
4、atomic与nonatomic
atomic:默认,原子性,数据同步,多线程中使用
nonatomic: 非多线程中使用,性能高一些
5、readwrite与readonly
readwrite:默认,自动生成存取器
readonly:只生成getter不会有setter方法
readwrite、readonly 作用是控制成员变量的访问权限。
6、strong与weak
强弱引用,与java类似
strong强引用,决定内存不被释放;
weak弱引用,无法决定内存释放被释放;
7、assign、copy、retain
assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。
一般用来处理基本数据类型
(如果a和b指向同一块内存,当a不再使用时,如果直接释放,b使用该内存时,会出crash)
retain和copy都是复制的意思,不过增加了引用计数
(如果a和b指向同一块内存,计数会累加,当计数为0时,可以释放)
区别:
retain拷贝的是指针;
copy拷贝的是内容;
8、extern 、static
extern类似于java的static,作用域:整个app,extern可置于变量或者函数前。
在另一个文件中,通过external全局变量的声明,就可以使用全局变量
static类似于java类的全局变量,作用域:当前类。
9、类方法、对象方法
类方法以 + 开头,调用方式如:[A m1];
对象方法以 - 开头,调用方式如:[a m2];
10、@property (class)
如:@property (class, nonatomic, assign, readonly) NSInteger userCount;
表示:给类增加一个属性。
其实就是给类增加了一个setting 和getter方法,+方法,注意没有生成实例变量,
这个属性,只是增加getting setting方法,我们需要自己添加静态变量
static NSInteger _userCount = 0;
11、@property定义在.h与.m中的区别
在.m文件中,相当于是@private权限,子类无法访问,也无法修改其权限;
在.h文件中,默认是@protected权限,子类可以访问,可以做权限修改;
12、static的作用
static关键字可以修饰函数和变量,作用如下:
一、隐藏
通过static修饰的函数或者变量,在该文件中,所有位于这条语句之后的函数都可以访问,而其他文件中的方法和函数则不行;
二、静态变量
类方法不可以访问实例变量(函数),通过static修饰的实例变量(函数),可以被类方法访问;
三、持久
static修饰的变量,能且只能被初始化一次;
四、默认初始化
static修饰的变量,默认初始化为0;
13、#pragma mark
将代码分成一个个逻辑块,便于查找
14、类扩展
以ViewController为例,语法:
@interface ViewController ()
@end
可定义属性,如:@property (nonatomic , weak) IBOutlet UILabel *label;
作用:非定义在头文件中,外部类不能使用该类的属性;
15、static
1、局部变量中:
只会被初始化一次,即使是在成员方法中,直到app结束,才释放内存;
2、全局变量:
内存同上,作用域为当前类,不能通过extern引用
(如果是未用static修饰全局变量,作用域为整个app,可被其他类通过extern引用)