默染江山——oc点语法、SEL

——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即是访问指向方法内存空间的地址,然后找到方法,从而调用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值