转:http://tigercat1977.blog.163.com/blog/static/2141561122012111292920505/
第二讲:Obj-C 点语法
2012-12-12 09:29:55| 分类: Objective-C | 标签:objective-c |字号大中小 订阅
为什么需要点语法、点语法的好处是什么。
@property @systhesize 如何使用
@property @systhesize 编译器如何展开
如何使用点语法
@property 其他属性
为什么要设计点语法
为了方便别的程序员转到 OC 开发上来
为了让程序设计简单化
隐藏了内存管理细节
隐藏了多线程、同步、加锁细节
点语法
属性可以在不使用括号的情况下使用点语法
无需调用 [foo value] 可以使用 foo.value 来访问虽然 foo.value 看起来像是直接访问 value 变量,
但是属性始终调用方法,而这些方法又可以访问对象的数据。
Dog.h 头文件申明
@interface Dog:NSObject
{
int age;
}
- (void) setAge:(int)newAge;
- (int) age;
@end
Dog.m 实现
# import "Dog.h"
@ implementation Dog
- (void) setAge:(int) newAge
{
age = newAge;
}
- (int) age
{
return age;
}
@ end
setter 和 getter 函数
- (void) setAge:(int) newAge;
- (int) age;
类似于 setAge: 设置新值一般叫做 setter 函数
类似于 age 取值一般叫做 getter 函数
使用经典调用和点语法
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 new Age is %d", dogAge);
点语法是编译器级别
dog.age = 200;
dogAge = [dog age];
编译器会把 dog.age = 200;
展开成 [dog setAge:200];
会把 dogAge = dog.age;
展开成 dogAge = [dog age];
函数调用
点语法 setter 和 getter 规范
setter 函数展开规范
dog.age = 200;
[dog setAge:200];
getter 函数展开规范
int dogAge = dog.age;
int dogAge = [dog age];
举例子
// Dog.h
@interface Dog : NSObject { int age; } // setter 和 getter 函数 - (void) setAge:(int)newAge; - (int) age; @end
// Dog.m
#import "Dog.h" @implementation Dog - (void) setAge:(int)newAge { age = newAge; } - (int) age { return age; } @end
// main.m #import "Dog.h" #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); Dog *dog = [[Dog alloc] init]; [dog setAge:100]; int dogAge = [dog age]; NSLog(@"dog age is %d", dogAge); // 经典方式 dog.age = 200; // 相当于[dog setAge:200] dogAge = dog.age; // 相当于dogAge = [dog age]; NSLog(@"dog new age is %d", dogAge); } return 0; }
/* 输出结果:
Hello,World!
dog age is 100
dog new age is 200
*/
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
@property
@property 是让编译器自动残生函数申明
不用写下面两行代码
- (void) setAge:(int) newAge;
- (int) age;
只需要下列一行就可以代替
@property int age;
Dog.h 头文件申明(使用@property)
@interface Dog:NSObject { init age; }
- (void) setAge:(int) newAge;// 这行不要,下边@prooerty 代替- (int) age;// 这行不要,下边@prooerty 代替 @property int age; // 由这行来代替 @end
@synthesize
@synthesize 就是编译器自动实现 getter 和 setter 函数
不用写下列代码
- (void) setAge:(int) newAge
{
age = newAge;
}
- (int) age
{
return age;
}
只需要写
@synthesize age;
Dog.m 使用 @synthesize
@implementation Dog @synthesize age; // 这行代替下边6行
- (void) setAge:(int)newAge{// 这行不要,被@synthsize 代替age = newAge;// 这行不要,被@synthsize 代替}// 这行不要,被@synthsize 代替- (int) age{// 这行不要,被@synthsize 代替return age;// 这行不要,被@synthsize 代替}// 这行不要,被@synthsize 代替 @end
举例子 (@property @synthesize)
// Dog.h @interface Dog : NSObject { int age; } @property int age; @end
// Dog.m #import "Dog.h" @implementation Dog @synthesize age; @end
// main.m #import "Dog.h" #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); Dog *dog = [[Dog alloc] init]; [dog setAge:700]; int dogAge = [dog age]; NSLog(@"dog age is %d", dogAge); // 经典方式 dog.age = 800; // 相当于[dog setAge:800] dogAge = dog.age; // 相当于dogAge = [dog age]; NSLog(@"dog new age is %d", dogAge); } return 0; }
/* 输出结果
Hello, World!
dog age is 700
dog new age is 800
*/
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
总结
getter and setter
属性一般需要提供赋值方法 setter 和取值方法 getter
赋值方法用于设置信息,取值方法用以获取信息,可以使用任意名字定义赋值方法和取值方法,
也可以使用 OC 约定的方法。
属性前面带有 set 前缀的设置方法,比如
@property int age; [在类申明中]
@synthesize age [在类实现中]
类内部 age 和 self.age 是不一样的
在 Dog 类内部可以直接访问 age 变量
直接访问 age 相当于 age 字段
self.age 是调用 getter 或者 setter 函数
@property 进一步说明
@interface Dog:NSObject {
int _age;
}
@property int age;
@end
@synthesize age = _age;
目的是避免函数名和字段重复
Dog.m @synthesize 展开实现
#import "Dog.h"
@implementation Dog
- (void) setAge:(int)newAge{
_age = newAge;
}
- (int) age{
return _age;
}
@end
属性可以是:
readwrite (缺省),readonle
表示属性是可读写的,也就是可以使用 getter 和 setter,而 readonly 只能使用 getter
assign (缺省),retain, copy
表示属性如何存储
nonatomic
表示不用考虑线程安全问题
getter = ... , setter = ....
重新设置 getter 函数和 setter 函数名
举例子 (@property @synthesize _ )
// Dog.h @interface Dog : NSObject { int _age; } @property int age; @end
// Dog.m #import "Dog.h" @implementation Dog @synthesize age = _age; @end
// main.m
#import "Dog.h" #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); Dog *dog = [[Dog alloc] init]; [dog setAge:1100]; int dogAge = [dog age]; NSLog(@"dog age is %d", dogAge); dog.age = 2200; dogAge = dog.age; NSLog(@"dog new age is %d", dogAge); } return 0; } /* 输出结果: Hello, World dog age is 1100 dog new age is 2200 */
完