ISO 学习笔记 2015-03-15

Objective--C 

一 关键字
@property 定义变量函数
@synthesize  实现变量函数


二 函数
alloc 分配内存
init 初始化
new 替代上面两个函数 分配内存,而且初始化

三 规则 

0 变量的修饰符 
@public @protected @private  @package
@public    实例变量能够被在任何地方访问。
@protected 实例变量能被声明它的类和子类访问,全部没有显式制定范围的实例变量都是@protected的。
@private 实例变量只能被声明它的类访问。
@package 使用runtime modern,一个@package实例变量在实现这个类的可执行文件镜像中其实是@public的,可是在外面就是@private(runtime请参考苹果文档Runtime Programming Guide)。
         这个类型最经常使用于框架类的实例变量,使用@private太限制,使用@protected或者@public又太开放。

1  类的实例成员变量(非静态变量)
赋值/取值 一般能够有三种方式,须要注意的是给字符串赋值时须要在字符串前加前缀 @ ;还有就是这些变量的访问只能在非静态函数转中访问;
A 对象.成员变量 @protected @public @private  
B 对象->成员变量  @public 
C [对象 成员变量set/get函数]  @public @protected @private  

2 类的静态变量 
A Objective-C自身时不支持静态变量的,可是因为ObjectiveC是C语言的超类,因此可使用C语言的static关键字来建立全局变量,全局变量跟Java里的static变量是同样的,只有在类第一次加载的时候才初始化,知道程序被销毁才被释放掉
B 静态变量的调用都必须在静态方法中,不管是赋值仍是取值 
C static静态变量还能够在方法内定义,只不过在方法内定义的static静态变量只能在方法内调用,方法外没法调用。

3 动态函数 
A 标识符 - 
B 调用方式 [实例化对象 函数]
C 实例方法在堆栈上
D 不能调用静态函数

4 静态函数 
A 标识符 +
B 调用方式 [类 函数]
C 静态方法在堆上分配内存 
D 不能调用非静态函数,其实也不是,假如在.h中没有定义,是不能调用的;

5 静态方法与实例方法区分
A 静态方法常驻内存,实例方法不是,因此静态方法效率高但占内存。事实上,方法都是同样的,在加载时机和占用内存上,静态方法和实例方法是同样的,在类型第一次被使用时加载。调用的速度基本上没有差异
B 静态方法在堆上分配内存,实例方法在堆栈上。事实上全部的方法都不可能在堆或者堆栈上分配内存,方法做为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的
C 实例方法须要先建立实例才能够调用,比较麻烦,静态方法不用,比较简单。
D 静态方法是静态绑定到子类,不是被继承。
E 通常使用频繁的方法用静态方法,用的少的方法用动态的。静态的速度快,占内存。动态的速度相对慢些,但调用完后,当即释放类,能够节省内存,能够根据本身的须要选择是用动态方法仍是静态方法。
F 静态方法修改的是类的状态,而对象修改的是各个对象的状态,这点也是它们重要的区别
G 类的实例化调用是在类的生命周期中存在,当类没有了之后,对应的实例也就没有了,对应的方法也就没有了,静态类否则,只要你引用了那个静态类的命名空间,他就会一直存在,知道你退出系统。

6  alloc\init 与 new  
A 在实际开发中不多会用到new,通常建立对象我们看到的全是[[className alloc] init]
B 区别只在于alloc分配内存的时候使用了zone 它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗不多的代价,提高了程序处理速度; 
C 而为何不推荐使用new?若是使用new的话,初始化方法被固定死只能调用init. 而你想调用initXXX怎么办?没门儿
D 采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式能够用其余定制的初始化方法。 

7 @property @synthesize 
A 做用 简化属性变量的SET,GET
B 简单语法语法 
	B1 @property 数据类型 变量名; 在.h 文件中;
	B2 @synthesize 变量名;
C 复杂语法
	C1 若是事先没有在{}中注册成员变量 _A,可是用@property定义了成员变量_A,那么系统会生成成员变量_A,可是该成员变量的是做用域是Private,因此了就不能用 对象->成员变量 来调用了 这个更为简洁
	C2 若是事先已经在{}中注册成员变量 _A,并且用@property定义了成员变量_A,那么系统会使用{}中成员变量_A,	并且必须在.m文件中用@synthesize实现,否则系统会报警告,	做用域以{}中的为标准,这个更为传统,严谨
D  属性 
	声明property的语法为:
	@property (参数) 类型 名字;这里的参数主要分为三类:
	读写属性(readwrite/readonly)
	setter语意(assign/retain/copy)
	原子性atomicity(nonatomic) 	
	D1 readwrite   默认属性 有get/set方法
	D2 readonly  只有get方法,没有set方法 因此它不能够和 copy/retain/assign组合使用
	D3 nonatomic  atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。在多线程环境下,原子操做是必要的,不然有可能引发错误的结果
				I,    当一个变量声明为nonatomic时,意味着多个线程能够同时对其进行访问
				II,    当一个变量声明为nonatomic时,它是非线程安全型,访问速度快;
				III,    当一个变量声明为nonatomic时,当两个不一样的线程对其访问时,容易失控。
	D4 atomicity 默认属性 线程安全原子操做
				I,当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问
				II,当一个变量声明为atomic时,该变量为线程安全型,可是会影响访问速度,
				III 当一个变量声明为atomic时,在非ARC编译环境下,须要设置访问锁来保证对该变量进行正确的get/set			
	D5 assign 简单赋值,不更改索引计数 对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)            I 用于基本数据类型
	D6 retain: 与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,dealloc会被调用,内存被释放            I 一般用于非字符串对象
	D7 copy用于非共享内存时,每一个指针有本身的内存空间            I 一般用于字符串对象        
相关文章
相关标签/搜索