黑马程序员—OC点语法和成员变量作用域
2014-09-04 16:30
253 查看
一、点语法
1.OC中点语法是方便从事别的语言开发的程序员迅速的转到OC开发当中,先看下面这个例子:
我们创建一个对象,来给这个对象设置年龄,我们是这样调用的:
这是OC中独有的语法,从事其他语言的开发者刚接触OC的时候可能会觉得很不习惯,为了方便其他语言开发者迅速的上手OC,OC语法就增加了点语法的功能,利用点语法可以这样设置和调用对象的名字:
这种语法和其他面向对象中的调用类成员的语法很相似,但是其本质还是很有大差别的
这里 p.age = 10; 等价于 [p setAge:10]; p.age = 10; 等价于int a = [p age];
点语法是直接调用对象的setter和getter方法来设置成员属性,而其他面向对象语言这样写可能是(如JAVA),可能是直接调用了成员属性来实现赋值和调用。
2.下面再看一点要注意的地方
修改上述的Person类的实现
这样实现setter和getter方法会引发死循环的,因为每当调用setter方法执行self.age = age;时,发现点语法,又开始找自身的setter方法,当然又进入setter方法里面执行self.age = age;了,如此就循环不断。getter方法同理。所以在setter方法和getter中慎用点语法。
二、成员变量作用域
OC中有4种成员变量,他们的作用域各有不同
1、@public
任何地方都能够直接访问
2、@protected
可以在当前类和子类的实现@implementation中直接访问(@interfac中默认就是@protected)
3、@private
只能在当前类的实现@implementation中直接访问,若子类想要访问父类的@private只能通过getter和setter方法。(@implementation中默认是@private)
4、@package
同一个体系(框架)中可以访问,作用域介于@private和@public之间
三、补充
1.在@implementation中也可以定义成员变量,只是变量默认属性为@private,并且其实际的意义很小,因为一般的工程中都是包含头文件的,没有包含你的m文件,也是这种成员变量不透明,别人也无法调用
2.没有@interface,只有@implementation,也可以开发一个类,但是编译器会报警告,也就是说不提倡这么写。
3.@interface和@implementation不能声明同名的成员变量。
1.OC中点语法是方便从事别的语言开发的程序员迅速的转到OC开发当中,先看下面这个例子:
// 声明一个Person类 @interface Person : NSObject { int _age; NSString *_name; } - (void)setAge:(int)age; - (int)age; @end // 实现Person类 @implementation Person - (void)setAge:(int)age { _age = age; } - (int)age { return _age; } @end
我们创建一个对象,来给这个对象设置年龄,我们是这样调用的:
Person *p = [Person new]; [p setAge:10]; int a = [p age];
这是OC中独有的语法,从事其他语言的开发者刚接触OC的时候可能会觉得很不习惯,为了方便其他语言开发者迅速的上手OC,OC语法就增加了点语法的功能,利用点语法可以这样设置和调用对象的名字:
Person *p = [Person new]; p.age = 10; int a = p.age;
这种语法和其他面向对象中的调用类成员的语法很相似,但是其本质还是很有大差别的
这里 p.age = 10; 等价于 [p setAge:10]; p.age = 10; 等价于int a = [p age];
点语法是直接调用对象的setter和getter方法来设置成员属性,而其他面向对象语言这样写可能是(如JAVA),可能是直接调用了成员属性来实现赋值和调用。
2.下面再看一点要注意的地方
修改上述的Person类的实现
@implementation Person - (void)setAge:(int)age { self.age = age; // 死循环 } - (int)age { return self.age; // 死循环 } @end
这样实现setter和getter方法会引发死循环的,因为每当调用setter方法执行self.age = age;时,发现点语法,又开始找自身的setter方法,当然又进入setter方法里面执行self.age = age;了,如此就循环不断。getter方法同理。所以在setter方法和getter中慎用点语法。
二、成员变量作用域
OC中有4种成员变量,他们的作用域各有不同
1、@public
任何地方都能够直接访问
2、@protected
可以在当前类和子类的实现@implementation中直接访问(@interfac中默认就是@protected)
3、@private
只能在当前类的实现@implementation中直接访问,若子类想要访问父类的@private只能通过getter和setter方法。(@implementation中默认是@private)
4、@package
同一个体系(框架)中可以访问,作用域介于@private和@public之间
三、补充
1.在@implementation中也可以定义成员变量,只是变量默认属性为@private,并且其实际的意义很小,因为一般的工程中都是包含头文件的,没有包含你的m文件,也是这种成员变量不透明,别人也无法调用
2.没有@interface,只有@implementation,也可以开发一个类,但是编译器会报警告,也就是说不提倡这么写。
3.@interface和@implementation不能声明同名的成员变量。
相关文章推荐
- 黑马程序员------OC基础-----点语法、id、构造方法、Category、成员变量作用域
- 黑马程序员——OC基础语法—点语法和成员变量作用域
- 黑马程序员——OC语言------NSString、多文件开发、点语法、成员变量的作用域、@property和@synthesize
- 黑马程序员——OC语言学习——Xcode开发初始化、点语法、成员变量作用域、关键字@property和@synthesize
- 黑马程序员——【OC】点语法以及成员变量的作用域
- 黑马程序员_iOS开发之OC之面向对象之多文件操作、点语法、成员变量的作用域和关键字@property与@synthesize
- 黑马程序员——OC基础---核心语法(点语法,成员变量的作用域,@property和@synthesize)
- OC特有语法1—点语法,成员变量作用域,@property,id,构造方法,多文件编程
- 黑马程序员——OC核心语法点语法,成员变量,@property和@synthetic,构造方法
- OC——多态、NSString的基本使用、点语法、成员变量作用域
- OC特有语法1—点语法,成员变量作用域,@property,id,构造方法,多文件编程
- 「OC」点语法和成员变量的作用域
- OC中的点语法,成员变量的作用域
- OC核心语法之NSString、点语法、成员变量作用域、@property和@synthesize
- 黑马程序员_object c学习日记①_类的声明定义、点语法及成员变量作用域
- 黑马程序员-- 核心语法 Property synthesize 成员变量的作用域
- 「OC」点语法和成员变量的作用域
- OC基础---NSString、多文件开发、点语法、成员变量的作用域、@property和@synthesize
- 9、黑马程序员-OC点语法和变量的作用域
- 黑马程序员--set get点语法 和 成员变量的作用域