——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
(一) 点语法
1、 简介
1>OC中的点语法其实没什么高端的,但是他和Java中的那种使用对象变量直接访问public类型的变量的点是不一样的,所以这里就单独说明一下。
2>点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用点语法的。
3>OC中的get方法和Java中不太一样,OC中只要一个方法有返回值都可以认为是get方法,Java中是形如getXXX这样的才叫做get方法。
2、初识点语法
先看一个例子:
1 #import <Foundation/Foundation.h>
2 #import "Person.h"
3
4 int main(int argc, const char * argv[])
5 {
6
7 @autoreleasepool {
8
9 // insert code here...
10 Person *person = [[Person alloc] init];
11
12 //[person setAge:10];
13 person.age = 10;//点语法,等效与[person setAge:10];
14 //这里并不是给person的属性赋值,而是调用person的setAge方法
15
16 //int age = [person age];
17 int age = person.age;//点语法,等效与int age = [person age]
18 NSLog(@"age is %i", age);
19 [person release];
20
21 }
22 return 0;
23 }
还应该记住,在OC中使用点语法有两个条件:
1、必须是属性
2、有对应的get/set方法
3、点语法的作用
OC设计点语法的目的,是为了让其他语言的开发者可以很快的上手OC语言开发,使用点语法,让它和其他面向对象的语言如java很像。
4、点语法的本质
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
如:
Stu.age=10;展开为:[stu setAge:10];
int a=stu.age;展开为:[stu age];
编译器如何知道是set方法还是get方法?主要是看赋值(可以使用断点调试来查看)。
在OC中访问成员变量只有一种方式即使用-> 如stu->age,这种情况要求在@public的前提下。
5、点语法注意点
点语法的使用注意
下面的使用方式是一个死循环:
(1)在set方法中,self.age=age;相当于是[self setAge:age];
(2)在get方法中,return self.age;相当于是[self age];
(二) SEL
1、介绍
1>SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法。
2>其实消息就是SEL。
2、SEL应用
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p = [[Person alloc] init];
// 第一种情况:将test2方法转成字符串,再转成SEL类型,再调用
NSString *name = @"test2";
SEL s = NSSelectorFromString(name);
[p performSelector:s];
// 第二种情况:间接调用test2方法
[p performSelector:@selector(test2)];
// 第三种情况:将带参数的test3方法转成SEL类型,再调用时补充参数
SEL s = @selector(test3:);
[p performSelector:s withObject:@"456"];
return 0;
}
由上面代码可总结SEL的使用步骤:
1>把test2包装成SEL类型的数据
2>根据SEL数据找到对应的方法地址
3>根据方法地址调用对应的方法
3、小结
1>无论怎么转化,当调用SEL时都必须是这样的格式:
[p performSelector: SEL类型];
2>SEL就是对方法的一层包装,指向方法的地址。
调用SEL即是访问指向方法内存空间的地址,然后找到方法,从而调用方法。