OC特有语法知识点总结:
方法调用:
Student *stu = [Student new];
[stu setAge:100];
int age = [stu age];
点语法:
stu.age= 100;
intage = stu.age;
当使用点语法时,编译器会自动展开成相应的方法
- (void)setAge:(int)age {
//下面的代码会引发死循环
self.age = age;
}
- (int)age {
// 下面的代码会引发死循环
return self.age;
}
作用域:
@private:只能在当前类的对象方法中直接访问
@protected:可以在当前类以及子类的对象方法中直接访问
@public:任何地方都可以直接访问
@package:同一个“体系内”(框架)可以访问,介于@private和@public之间
没有@interface,只有@implementation,也可以开发一个类:
用在@inteface中
用来自动生成setter和getter的声明
用@propertyint age;就可以代替下面的两行
-(int)age; // getter
-(void)setAge:(int)age; // setter
万能指针,能指向任何OC对象,相当于NSObject *
id类型的定义 :
typedefstruct objc_object {
Class isa;
} *id;
// 注意:id后面不要加上*
id p =[Person new];
new的拆分两部曲:是语言简化:
分配内存(+alloc)
初始化(-init)
Person*p1 = [Person alloc];
Person*p1 = [p1 init];
合成一句后:
Person*p = [[Person alloc] init];
想在对象创建完毕后,成员变量马上就有一些默认的值
init方法的重写过程:
- (id)init
{
if (self = [super init])
{
_age = 10;
}
return self;
】
构造方法的一些规范:
返回值是id类型
方法名都以init开头
- (id)initWithAge:(int)age{
if (self = [super init]) {
_age = age;
}
return self;
}
传递多个参数进行初始化
- (id)initWithAge:(int)age andNo:(int)no;
与C语言类似,但有区别:
每个类分布在不同文件中
类的声明放在.h文件,类的实现放在.m文件
若想使用某个类,就包含某个类的.h声明文件
分类的声明:
@interface 类名 (分类名称)
// 方法声明
@end
分类的实现:
@implementation 类名 (分类名称)
// 方法实现
@end
其实类也是一个对象,是Class类型的对象,简称“类对象”
Class类型的定义:
typedef struct objc_class *Class;
类名就代表着类对象,每个类只有一个类对象
获取类对象的两种方法:
Class c = [Person class]; // 类方法
或者
Person *p = [Person new];
Class c2 = [p class]; // 对象方法
Class c = [Person class];
Person *p2 = [c new];
使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出
修改NSLog的默认输出:
重写-description或者+description方法即可