点语法:
用途:
OC当中通过@property和 @synthesize 配对使用来自动生成变量的set和get方法,通过使用点语法可以大大减少我们程序员代码量,也方便学习过其他语言的人上手OC语言
简而言之:
1.减少代码量
2.方便其他语言使用者阅读
用法:
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const char * argv[])
- {
- Person *p = [Person new];
- // [p setAge:10]; //用点语法代替就是 p.age = 10;
- // int a = [p age]; //用点语法代替就是 int a = p.age;
- NSLog(@"Age is %d",a);
- return 0;
- }
编译器遇到点语法时,会自动展开成其相应的方法
@property
@property可以自动生成某个成员变量的setter和getter声明,但是.h文件中还是要写实现
比如:
在.h文件中
- @property int age; // 这行可以代替下面两行
- // -(void) setAge:(int)age;
- // -(int)age;
@synthesize
@synthesize可以在.m文件中自动生成setter和getter的实现,并且会访问该成员变量
比如:
- @synthesize int age = _age; // 等号左边的age是@synthesize要实现的变量名
- // 右边的_age是@synthesize要返回的变量名,就是要赋值的变量
如果@synthesize定义一个未知的变量,那么这个变量的默认就是@private类型的
Xcode4.4以后,其实只需要用@property这个关键字就行了,它会自动生成成员变量,会声明和实现getter和setter方法
其缺陷是自动生成的成员变量是@private,子类只能通过geter和setter方法访问,但是可以手动改变成员变量的作用域
description
description默认返回的是 <类名:内存地址>
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main()
- {
- Person *p = [[Person alloc] init];
- p.age = 20;
- p.name = @"jack";
- NSLog(@"%@",p);
- return 0;
- }
此时输出的结果就是person:内存地址
因为Nslog(@"%@",p);这句会调用p的description方法,而方法默认返回的就是 <类名:内存地址>,所以想要返回自己想要的结果,可以在.m文件中修改description方法的返回值
- #import "Person.h"
- @implementation Person
- - (NSString *)description
- {
- return [NSString stringWithFormat:@"%d,%@",_age,_name];
- }
- @end
此时NSlog输出的就是年龄和名字了
SEL
每个方法都有一个和他相对应的SEL数据,每个SEL数据都相对应着这个方法的地址
也可以理解为SEL就是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法
方法调用的过程:
当调用方法的时候,编译器会把方法包装成SEL类型的数据,然后去类里找这个SEL数据相对应的方法的地址,找到之后就会调用这个方法
以上操作是有缓存的
其实调用方法还可以用SEL数据来调用
- [p performSelector:@selector(test)]; // 效果和[p test];一样
带参数的方法调用:
- [p performSelector:@selector(test3:) withObject:@"hhe"];
在一个方法中用如下使用self和SEL数据,会引发死循环
- [self performSelector:_cmd];
NSLog输出补充
- // 指针变量地址
- NSLog(@"%p",&p);
- // 对象地址
- NSLog(@"%p",p);
- // <类名:对象地址>
- NSLog(@"%@",p);
NSLog输出C语言字符的时候 不允许有中文
NSLog(@"%s",str);
id
id是一种数据类型,被叫做万能指针,可以操作任何OC对象,因为id这个类型已经被写入了”*“,所以不用再加上星号
sample code:
- int main()
- {
- //Person *p = [Person new];
- //只适用OC对象
- id person = [Person new];
- [person setAge:10];
- NSLog(@"age=%d",[person age]);
- return 0;
- }