一、点语法1、点语法本质还是方法调用,当使用点语法时,编译器会自动展开成相应的方法
1>如何判断set和get方法:如果是赋值,则是set方法。eg:stu.age = 10;否则是get方法:eg:int age = stu.age;2> 一定要与访问成员变量区分开。访问成员变量:p->_age;
二、成员变量作用域成员变量的常用作用域有3种:
1> @public 全局都可以访问,任何地方都可以直接访问。
2> @protected 只能在当前类和子类的实现@implemetation中直接访问。
3> @private 只能在当前类的实现@implemetation中直接访问。
4> @package:在同一框架中可以访问,介于@private和@public之间。
注意:
1> 写在方法申明中(即@interface中)的成员变量,如果什么都不写默认情况下为protected类型。
2> 写在方法实现中(即@implemetation中)的变量,默认情况下为私有的provite类型。此时哪怕是变量前面加上了@public也没用。如果将@implementation搬到了main函数前面,那么在@implementation中定义的成员变量前面加上@public就有效了,此时可以在任何地方访问。若放在main函数之后则出错。
3> OC里的继承只是单继承,只有一个类。
eg:<span style="font-size:14px;">#import <Foundation/Foundation.h> @interface Student : NSObject { int age; // 年龄 @public int no; // 学号 int score; // 成绩 @protected float height; // 身高 @private float weight; // 体重 } - (void)setAge:(int)newAge; - (int)age; @end </span>
一共有5个成员变量,其中
@public作用域的有:no、score
@protected作用域的有:age、height,age虽然没写类型,但是默认情况下为@protected 类型
@private作用域的有:weight
一定要记住:一个冒号:对应一个参数,而且冒号:也是方法名的一部分。三、@property和@synthesize
1>@property: 可以自动生成某个成员变量的setter和getter的方法声明eg:@property int age; // 会自动生成_age成员变量, int是get方法的返回值类型和set方法的形参类型。 age是set形参名和get的方法名自动生成 - (void)setAge:(int)age;- (int)age;
2>@synthesize :自动生成set方法和get方法的实现,并且会访问_age这个成员变量。eg:@synthesize age = _age; 代表形参age会访问_age这个成员变量,如果_age不存在(这里的不存在是指没有声明_age),则会自动生成一个@private的成员变量_age;@synthesize age; 代表在set和get方法的实现中会访问age成员变量,如果成员变量age不存在,则自动生成一个private类型的age成员变量。
3>注意点(1)方法调用时,会优先调用手工编写的方法,如果没找到再调用自动生成的方法。(2)@property会自动生成_成员变量名。eg: @property age; // 自动生成_age,类型是@private;@synthesize 会自动生成 成员变量名。eg: @synthesize age; // 自动生成age,类型是@private;其实,@property既可以生成get和set方法的声明,也可以生成set和get方法的实现。eg:<span style="font-size:14px;">@interface Person:NSObject @property int age; @end @implementation Person @end</span>
解析:@property int age代码有如下三个作用:1>生成成员变量_age。2>声明成员变量_age的setter和getter方法3>实现成员变量_age的setter和getter方法
四、id概念:万能指针,能指向或操作任何OC对象。(已经包含了* ,在调用时不需要加*)相当于NSObject *eg: id d= [person new]; // 使用student类创建对象d或者 NSObject *d = [person new]; // 多态语法
五、构造方法(init)定义:用来初始化对象的方法,是个对象方法。以“-”开头目的:为了让对象创建出来,成员变量就拥有固定值(每个对象内部的成员变量默认初始化全部为0)注意点:(1)先调用父类的构造方法(eg:[super init])(2)再进行子类内部成员变量的初始化
1、创建对象过程(1)分配存储空间:使用 +alloc 给对象分配空间 (返回一个分配了空间的对象,但是没有初始化)Person *p1 = [Person alloc];(2)初始化 使用 -init 初始化对象Person *p2 = [p1 init];以上可以归纳为 Person *p3 = [[Person alloc] init];2、执行过程:-(id)init //为什么使用id,因为id可以指向任何数据类型,而init可以被任何数据类型访问,其返还值不确定,故用id。 { if(self=[super init])//初始化子类的时候,一定要调用super的init方法,即初始化父类的成员变量和相关方法,返回已经初始化了的当前对象self,如果初始化成功,则继续操作。 { _age = 10; }return self;//返回一个已经初始化了的对象 }
![]()
注:student初始化时调用person的init方法。person初始化时调用NSObject的init方法。赋值顺序:首先赋值ISA,然后再赋值_age,最后初始化_no(从父类开始赋值)初始化顺序:1>先初始化父类,然后再初始化子类。但是调用的时候先调用子类的方法,再调用父类方法。2>先初始化自身的ISA,然后再初始化其它成员变量。
3、自定义构造方法规范:(1)一定是对象方法,一定以 - 开头(2)返回值一定是id类型(3)方法名一般是以init开头。(4) 成员变量数量:自有成员变量加父类成员变量。(NSObject默认有成员变量ISA)eg:原则:父类的成员变量父类处理,子类的成员变量子类处理。-(id)initWithAge:(int)age //设置初始化方法,方法名:initWIthAge: { if(self=[super init]) { _age = age; } return self; } int main() { Person *p=[person alloc]initWithAge:20;//初始化之后age的默认值为20. return 0; }
多参数:- (id) initWithName:(NSString *)name andWithAge:(int)age { if(self = [super init]) { _name = name; _age = age; } return self; }<strong> </strong>
4、new方法和alloc、init方法区别new 是分两步来生成对象的
1> 调用+alloc 方法来给对象分配内存空间
2>调用-init 方法给对象的成员变量初始化成默认的值
缺点: 不能在创建对象的同时进行一些必要的初始化值
alloc、init方法优点: 可以在对象初始化时,使成员变量拥有必要的初始化值
OC基础——核心语法
最新推荐文章于 2015-04-15 15:51:22 发布