2、点语法-OC

点语法

1、为什么需要点语法,点语法好处是什么?

2、@property @synthesize 如何使用,编译器如何展开?

3、点语法如何使用?

4、@property 其他属性。

 

1、为什么需要点语法,点语法好处是什么?

(1)为了方便别的程序员转到oc开发上来(c/c++有点语法机制,但增加了oc开发难度)

(2)为了程序设计简单化

(3)隐藏了内存管理细节

(4)隐藏了多线程,同步,枷锁细节(多线程访问一个变量时就需要枷锁处理)

2、点语法

(1)属性可以在不适用括号的情况下使用点语法

(2)[foo value] 等同于 foo.value

例子:

2、点语法-OC_第1张图片

使用:

2、点语法-OC_第2张图片

注意: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;

2、点语法-OC_第3张图片

(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 改变。

例子:(设置只读)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(2、点语法-OC)