OC-学习Tips
(Objective-C)
13,多参数方法:(函数名:f::)
参数能够在 : 前面设置一个标签label,标签label也是函数名的一部分,方便阅读(不带标签实际上也有个匿名标签),第一个参数不能有标签,实际上函数名就是第一个参数的标签。
14,OC不是严格的函数重载(和C++不同),主要看标签中,函数名和参数数量是否相同,不是看参数类型,如:
- (int)g:(int)x;
- (int)g:(flota)x; //错误,方法冲突了
- (int)g:(int)x:(int)y; //正确,两个匿名标签
- (int)g:(int)x andY:(int)y; //正确,第二个标签为andY
15,Message 消息机制(函数-消息-方法)
发送消息:[obj message] 或 obj.message
OC在.h文件中定义的所有函数都是public的,OC通过categories来实现函数私有化(或不在头文件中声明而去.m文件中直接实现)
16,凡是以initXXXX开头的都是构造函数,如:
- (id)init;
- (Dog *)initWith;
17,NSLog 和 printf 都会在console中输出显示结果,不同的是,前者传递进去的格式化字符是NSString的对象,而不是char * 这种字符串指针。
18,OC中的类由接口和实现两部分组成:接口部分声明类中的实力变量和功能,接口部分实现接口中的功能。
19,OC中,类的对象无法声明在栈中,只能声明在堆里。
20,alloc / new ,一个对象在堆中开辟了空间,栈中有一个对象地址,先有类还是先有对象,看站的角度。
21,类的封装,封装成员变量,成员方法,subclass基类
22,构造方法:(类的封装)
(1)在一般语言中,在创建对象时自动调用的方法称为构造方法。
(2)在OC中,方式用init开头的成员方法都是构造方法。
构造方法一般用于对象的初始化, 无参的构造方法返回值是当前对象的地址。
23,构造函数和析构函数
构造函数一般以initWithXXXX开头-初始化。
析构函数dealloc:对象从内存中销毁前调用的函数。
构造方法:
- (id)init {
if (self = [super init]) {
//_FUNCTION_当前函数本身
}
return self;
}
- (void)dealloc {
NSLog(@"name:%@ release",_name);
[super dealloc];
} //在对象完全消失的时候调用,对象销毁时,对象计数器=0。
//不要人为的调用[xxx dealloc],应该用release销毁[xxx release],release使对象计数器-1,减到0,就会自动调用dealloc函数
- (void)initialize; //类第一次实例化时调用,只调用一次
24,self指针(super)(Java中的this、super):指向当前对象的指针,"+"类方法直接用类名调用(静态方法)
25,类方法不能访问成员变量,类方法不能调用对象的方法。
26,静态变量(全局、局部)
未初始化前默认为0,作用域为当前文件,在全局数据区分配。
静态函数:不能被其他文件所用,其他文件可以定义相同的函数名而不冲突。
27,点语法 是编译器级别:
dog.age = 200; <=> [dog setAge:200];
int dogAge = dog.age; -<=> int dogAge = [dog age]; //具体调用了哪个方法编译器会自动判断
28,@property int age <=> - (void)setAge:(int)newAge;- (int)age; // .h文件中的声明
@synthesize <=> - (void)setAge:(int)newAge{} - (int)age{} //.m文件中的实现
29,age 与 self.age :在Dog类内部可以直接访问age变量,前者直接访问相当于访问age字段,后者是调用setter和getter函数。
30,@property 参数(属性):readwrite(getter/setter,缺省),readonly(getter);
assign(缺省),retain,copy -->表示属性如何存值;
nonatomic -->表示考虑线程安全问题;
getter=...;setter=...;,重置getter函数和setter函数。
31,Category
*** 实现继承之外的扩展方法的机制,只能扩展函数、消息,不能扩展字段、变量等。
Category命名规范:要扩展类名+,扩展变量.[hm]
比如:NSString+ReverseString.h NSString+ReverseString.m
-----