OC特殊语法区别知识点总结

来源:互联网 发布:北京域名快速备案 编辑:程序博客网 时间:2024/05/17 07:13

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方法即可

0 0