点语法
1、为什么需要点语法,点语法好处是什么?
2、@property @synthesize 如何使用,编译器如何展开?
3、点语法如何使用?
4、@property 其他属性。
1、为什么需要点语法,点语法好处是什么?
(1)为了方便别的程序员转到oc开发上来(c/c++有点语法机制,但增加了oc开发难度)
(2)为了程序设计简单化
(3)隐藏了内存管理细节
(4)隐藏了多线程,同步,枷锁细节(多线程访问一个变量时就需要枷锁处理)
2、点语法
(1)属性可以在不适用括号的情况下使用点语法
(2)[foo value] 等同于 foo.value
例子:
使用:
注意:dog.age中的age不是Dog.h中声明的变量,而是setAge这个函数,age这个变量是不能直接被调用的。
系统编译器会将:
dog.age = 200; 展开成[dog setAge:200];点语法在左边就是一个set函数;在右边就是一个get函数
dogAge = dog.age; 展开成 dogAge = [dog age];
点语法setter 和getter规范【编译器遵循下面规则是死的】
如果在左边 编译器语法展开就是将 age 变成 前面加 set ,然后 a 大写为A;
如果要使用点语法,必须按照上面规则写上set函数和get函数;
int main( int argc, const char * argv[] ) { @autoreleasepool{ NSLog(@"hello, word!"); //经典方式 Dog *dog = [[Dog alloc] init]; [dog setAge:100]; int dogAge = [dog age]; NSLog(@"dog age is %d",dogAge); //点语法 dog.age = 200; dogAge = dog.age; NSLog(@"dog age is %d",dogAge); } return 0; }
2、@property @synthesize 如何使用,编译器如何展开?
(1)@property 是让编译器自动产生函数申明;
不用写下面2行代码:
-(void) setAge:(int)newAge;
-(int) age;
只需要写下列一行就可以代替
@property int age;[注释:我理解是申明参数外部调用功能]
(2)@synthesize 就是编译器自动实现getter和setter函数
不用写下面2行代码:
-(void) setAge:(int)intAge
{
age = newAge;
}
-(int) age
{
return age;
}
只需要写:
@synthesize age;
(3)property进一步说明
将参数和函数名区分开来:
@interface Dog:NSObject{
int _age;
}
@property intage;
@end
@synthesizeage= _age;
[主要目的:避免函数名和字段重复]
展开形式:
-(void) setAge:(int)newAge
{
_age= newAge;
}
-(void) age{
return _age;
}
4、@property 其他属性。
(1)readwrite(缺省):表示可读可写;readonly:只读
(2)assign(缺省)[就是=号],retain[后面会讲],copy 表示属性可存储
(3)nonatomic:表示不考虑线程安全问题;
(4)getter=... , setter=... :重新设置getter函数和setter函数名
使编译器展开age 和 setAge 改变。
例子:(设置只读)