1、OC基础语法
点语法,对应着getter和setter方法。例如 car.speed = 5; 实际上是 car -> setSpeed(5) 而 NSLog(@"%d",car.speed);实际上是要通过 car -> getSpeed() 来打印
在.m文件的implementation中也可以定义变量,但是这个变量是私有的。因为.m文件不可能被任何文件所包含,不可能被任何文件所用,只是他自己用变量,所以是私有的。
我都忘了oc里面的getter和setter方法的自动实现了:举例,有一个变量 int _age; 则 .h文件中 用 @property int age; 表示setter和getter方法的声明。.m文件中 用 @synthesize age = _age;来表示getter和setter方法的实现
相同类型的变量,可以连起来写,比如 @property int age,score; @synthesize age=_age,score=_score;
更省略的写法:如果只写 @property int age; 和 @synthesize age = _age; 而不在.h文件中写 int _age;的声明,那么在.m文件中会自动生成 _age 的定义,而因为是在.m文件中默认生成的,所以这个 _age变量是私有的,而不是像.h文件中定义的是protected的。如果@synthesize再省一些,写成@synthesize age;那么其实就默认为这样:@synthesize age = age;自动生成一个private的age变量。
在xcode4.4以上,还有更简的写法就是 @property int age; 只写这一行就OK了,其他的变量声明 和 @synthesize实现都由xcode自动实现
id表示万能指针,可以指向和操作任何OC对象。可以认为id 于 NSObject * 等同。所以id 后面的变量就不要再加*了。
Person * p = [Person new];其实这个new方法是两个方法的合体,他的运行过程分别是1、首先调用类方法 alloc 分配存储空间, Person *p1 = [Person alloc];即返回一个分配好内存空间的Person对象,但是里面的值还没有初始化;然后2、再调用类方法init初始化对象 即 Person *p2 = [p1 init]; 这个init方法就是构造方法。把这两个一合,所以实际上等同于 Person *p =[[Person alloc] init]。之所以实际运用中不采用new 方法,是因为他太死板,只是这两个方法的合体。而实际中,我们可能需要不同的初始化构造方法。
重写构造方法init的步骤
-(id)init{ self = [super init]; // 1、初始化父类中声明的一些成员变量和方法 返回当前这个对象
if(self!=nil){ /// 自定义代码 } // 2、如果初始化对象成功,才有必要进行接下来的初始哈。判断返回的对象是否成功 nil 其实也就是0
return self; } // 3、返回一个已经初始化完毕的对象。
如果Person类有自定义构造方法 -(id)initWithName:(NSString *) name; Student类继承Person类,那么如果其需要扩充自定义方法,则如下 -(id)initWithName:(NSString *) name andAge:(int) age{ if(self = [super initWithName:"zhangshan"]){ custom code } return self;}
Category类目 中 1、不能扩充属性,但是可以用原来的属性 2、如果有和父类相同的方法,则覆盖父类方法。3、如果两个类目中扩充了相同名字的方法,则在调用的时候,看编译顺序,后编译的是执行结果。编译顺序在Xcode的Build Pharse中的Compile Sources中可以找到和调整。主程序调用方法的顺序是先在类目中找,然后再到原类中找,最后到父类中找。
类本身也是内存中的一个对象,是Class类型的对象 Class c = [Person class]; 这是调取了Person类在内存中的类对象,注意Class中已经包含了*了。若有两个Person对象 p1 p2 则 [p1 class] 和 [p2 class]返回值都一样,都是Person类在内存中的类对象,地址一样。
当程序启动的时候,就会加载一次项目中所有的类(包括类目)。类加载完毕后就会调用类方法 +load方法。也就是说,不管你程序中用不用某个类,只要程序启动,就会在加载类完毕后调用所有类的 +load方法。+initialize方法是类在第一次使用的时候才调用的。注意是第一次使用!以上两个方法的调用顺序都是先调用父类的