OC特有语法1—点语法,成员变量作用域,@property,id,构造方法,多文件编程

来源:互联网 发布:淘宝装修显示模板过期 编辑:程序博客网 时间:2024/05/17 21:39

http://blog.csdn.net/a88410518/article/details/45074141

一.点语法


1.利用点语法可以替换set方法和get方法

Person *p = [ [Person alloc] init];

p.age = 25 等价于 [p setAge:25]

p.age 等价于[p age]

主要是看p.age是被赋值还是直接拿来用,被赋值则表示set方法,直接拿来用则是get方法。


2.点语法的本质

(1)点语法的本质还是方法调用,只是编译器特性。

(2)当使用点语法时,编译器会自动将它变成对应的方法。主要看点语法是直接拿来用还是被赋值的,然后替换成想要的get和set方法。


3.点语法的典型错误

get和set方法内部self.age的使用和方法和方法本身一致,就会死循环。


二.成员变量的作用域


局部变量和全局变量有自己的作用域,成员变量也有自己的作用域

1.成员变量修饰符(这些作用域的前提是你有这个成员变量的声明)

(1)@public:任何地方都可以直接访问对象的成员变量。

(2)@protected:可以在当前类以及其子类的方法中直接访问(@interface中声明的成员变量默认是@protected)。

(3)@privata:只能在当前类的方法中直接访问(@implementation中声明成员变量默认是@privata)。

(4)@package:同一个"体系内"(框架)可以访问,介于@privata和@public之间


2.补充

(1)没有@interface,只有@implementation,也可以开发一个类。几乎没人这么干,程序的可读性很重要,编程是个团队合作的。

(2)@interface@implementation中不能声明同名的成员变量。


三.编译器特性-@property


1.@property

(1)@property是用在@interface中

(2)@property可以自动生成setter和getter方法的声明

(3)@property int age 就可以代替成员变量_age的get方法和set方法的声明,即等价于

[objc] view plain copy
  1. - (int)age; // get方法  
  2. - (void)setAge:(int)age; // set方法  

2.@synthesize

(1)@synthesize是用在@implementation中

(2)@synthesize可以自动生成setter和getter方法的实现

(3)@synthesize  age = _age(不写= _age,则表示生成成员变量age的方法的实现) 就可以代替成员变量_age的get方法和set方法的实现,即等价于

[objc] view plain copy
  1. - (int)age  
  2. {  
  3.      return _age;  
  4. }  
  5.   
  6. - (void)setAge:(int)age  
  7. {  
  8.     _age = age;  
  9. }  


3.注意

(1)synthesize age = _age;
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
(2)@synthesize age;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
(3)手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法和不存在的成员变量。
若手动实现了getter方法,编译器就只会自动生成setter方法和不存在的成员变量
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量


4.最后

(1)自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现,并生产_的成员变量,并且成员变量是定义在@impelementation中的私有变量。

(2)默认情况下,@property生成的setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量。

四.id


1.id是万能指针,能指向\操纵任何OC对象,相当于NSObject *(但不等于)。

2.id本身已经是指针类型,不需要定义变量时在变量前面加上*。

3.id对象的变量不能用点语法,只能用直接用set和get方法。


五.构造方法


1.构造方法:用来初始化对象的方法,是个对象方法,-开头。类方法new其实是类方法+alloc(分配内存)和对象方法-init(初始化)的组合,先alloc再init。


2.重写构造方法

(1)目的:为了让对象创建出来,成员变量就会有一些固定的值。
(2)init方法会初始化已经分配好空间的对象。默认初始化值为0。但是有时需要有其他的默认值,就需要对init方法进行重写。重写格式:

[objc] view plain copy
  1. - (id)init  
  2. {  
  3.      if(self = [super init]) // 初始化父类后,判断初始化是否成功  
  4.      {  
  5.           _age = 25;  
  6.      }  
  7.      return self// 返回一个已经初始化完毕的对象  
  8.   
  9. }  

(3)重写构造方法的注意:一定要先调用父类的构造方法([super init])初始化父类中的成员变量和其它属性,然后再进行子类内部成员变量的初始化


3.如果需要自己传入参数来初始化则就需要自定义构造方法,自己构造init方法

(1)返回值是id类型

(2)是对象方法,以-开头

(3)方法名以initWith开头 :- (id)initWithAge:(int)age

(4)如果自定义方法中一些变量在父类已经有了自定义构造方法了,就调用父类的这个构造方法,即父类的属性交给父类方法去处理,子类方法处理子类自己的属性。


六.多文件编程


1.每个类分开写在不同的文件中

2.类的声明放在.h文件中,类的实现放在.m文件

3.若想使用某个类,就包含某个类的.h声明文件。


七.补充


#pragma mark可以用来做在代码中做标记,方便查找代码。


0 0
原创粉丝点击