黑马程序员—OC语言基础—核心语法小结
来源:互联网 发布:问道手游百度端口 编辑:程序博客网 时间:2024/05/16 07:34
————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————
本文将会总结一些OC特有的一些核心语法,比如点语法、@property和@synthesize、id等等语法。
一、点语法
OC中的点语法与Java中的点语法不同,不是代表访问类中的相应成员变量的,在OC中是表示转为相应的get方法和set方法的。只要记住这一句话,那么点语法就迎刃而解了。
我们举个例子说明一下点语法的作用:
@interface Person : NSObject{ int _age; //年龄}//getter和setter的声明- (void)setAge:(int)age;- (int)age;@end@implementation Person//getter和setter的实现- (void)setAge:(int)age{ _age = age;}- (int)age{ return _age;}@end
int main(){//创建新的对象 Person *p = [[Person alloc] init];//利用点语法给成员变量_age赋值 p.age = 10; int a = p.age; NSLog(@"人的年龄为%d,%d岁", p.age, a); return 0;}
其中main函数中的p.age = 10;就等于[p setAge:10];,编译器就把它翻译成set语句。同理,int a = p.age;就等于int a = [p age];
二、成员变量的作用域
有四种情况,分别为@public、@private、@protected和@package。
这四种情况都可以写在定义成员变量时的前面,不过请注意,当写了一种以后,如果不写其他的关键字,那么默认之后全是这一种作用域作用。
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)
@protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
注意:
@interface中默认就是@protected,也就是说在@interface中定义的成员变量,如果不加任何关键字修饰的话,那么这些成员变量只能在当前类以及子类的对象方法中访问,其他的均不可以直接通过成员变量名访问。
@implementation中默认是@private,也就是说在@implementation中定义的成员变量,如果不加任何关键字修饰的话,那么这些成员变量只能在当前类的对象方法中访问,其他的均不可以直接通过成员变量名访问。
另外,@interface和@implementation中不能声明同名的成员变量
因此我们一定要注意成员变量定义时的作用域,以免在编程中造成不必要的麻烦。
理解误区:
当类中又@private的成员变量时,该类的子类是不能直接在.m文件中直接访问的,但是要明白的是,不能直接访问与没有这个成员变量是两码事。也就是说子类中是由@private的成员变量的,只是不能直接调用而已。因为根据继承原理,我们知道,继承就是子类拥有父类所有的属性与方法,包括了成员变量!
补充:
1)程序中不写@interface在语法上是可以的,但一般我们都要写声明,这样才让人一眼就能看明白。
2)如果把@implementation中的成员变量写在调用它的main函数之前,并且定义上@public作用域,那么main函数也是可以调用的。要特别记住这两个条件,(1)在调用之前定义,(2)要定义上@public
三、@property和@synthesize
@property和@synthesize是帮助我们自动生成set方法和get方法的。
1.@property——自动生成某个成员变量的set和get方法声明
@property int age;就相当于
- (void)setAge:(int)age;- (int)age;
这是编译器的一种特性,当读取到@property代码时,它就会按照声明的方法翻译来代替代码。
2.@synthesize是帮助我们自动生成set方法和get方法实现的,并且会访问等于号右边的这个成员变量。
@synthesize age = _age;这句的意思是,要把property中的age进行实现,_age代表实现中是访问_age。
就相当于
- (void)setAge:(int)age{ _age = age;}- (int)age{ return _age;}注意:如果只写
@synthesize age;那么访问的就不是_age,而是age,特别要注意这一点!
3.set方法和get方法的最简写法
@property int age;只写@property,不写@synthesize,这样也是可以的。那么这里@property做了3件事情:
1)生成getter和setter的声明
2)生成带_age的一个成员变量
3)生成getter和setter的实现
这样虽然极大的简化了程序。但是也有缺点,就是只写@property生成的成员变量是@private的作用域,成员变量私有了,子类是不能直接访问的,只能通过getter和setter来访问。
总结:
1.@property用在@interface中,用来自动生成setter和getter的声明;
2.@synthesize用在@implementation中,用来自动生成setter和getter的实现;
3.@synthesize的细节
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,编译器就只不会自动生成不存在的成员变量。注意:也就是说如果setter和getter都有了,但没有定义成员变量,那么就会报错。
四、id类型
id是万能指针,相当于NSObject *(也就是说id后面不能再跟*了),能指向任何OC对象。
举一个id的应用场景:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @property id obj; @endPerson.h
import "Person.h"@implementation Person@endmain.m
#import <Foundation/Foundation.h> #import "Person.h" void test(id d) { } int main(int argc, const charchar * argv[]) { @autoreleasepool { Person *p = [Person new]; NSObject *o = [Person new]; id d = [Person new]; [d setAge:10]; [d setObj:@"321423432"]; NSLog(@"%d", [d age]); } return 0; }注:id后面不加*。
学习小感悟:
OC中像几种小语法还是比较多的,但是只要抓住每一个关键字的本质特性,那么也会觉得还是挺简单的,我们要熟记这些语法。这些语法可能总结的不是很全面,之后有新的OC特有语法我再加进博客当中。
- 黑马程序员—OC语言基础—核心语法小结
- 黑马程序员——OC语言基础篇---核心语法
- 黑马程序员——OC语言核心语法
- 黑马程序员—OC语言基础—基础语法知识
- 黑马程序员——OC核心语法
- 黑马程序员—OC语言基础—方法小结
- 黑马程序员—OC语言基础—Foundation框架小结
- 黑马程序员----OC基础--核心语法、关键字
- 黑马程序员———OC基础语法(三)---核心语法(1)
- 黑马程序员———OC基础语法(四)---核心语法(2)
- 黑马程序员——OC基础语法
- 黑马程序员——OC基础语法
- 黑马程序员——oc基础语法
- 黑马程序员——OC基础—核心语法(上)
- 黑马程序员——OC基础—核心语法(下)
- 黑马程序员——OC基础---核心语法(id,构造方法,Category,description,SEL)
- 黑马程序员——oc核心语法1
- 黑马程序员——OC-10:核心语法
- Android AsyncTask使用心得及错误处理-只能在主线程改变UI组件
- iOS- 绘图API
- 李开复写给中国大学生的第二封信
- Mac App名字支持多语言显示
- 初创公司kisslink:70亿美金从天而降,他的人生却因kiss而改变
- 黑马程序员—OC语言基础—核心语法小结
- 数据库 - 连接查询、嵌套查询、集合查询
- oracle数据库升级 11.2.0 到11.2.4
- UVALive 6886 Golf Bot(FFT)
- 让程序员变懒的工具 : Jenkins + 蒲公英
- easyui tree 显示数据
- Activity生命周期之我见
- oracle数据库简单操作
- Spring学习1:Spring源码阅读环境搭建