第二讲:Obj-C 点语法
来源:互联网 发布:巴比馒头 知乎 编辑:程序博客网 时间:2024/05/02 00:37
转: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, Worlddog age is 1100dog new age is 2200*/
完
- 第二讲:Obj-C 点语法
- 第一讲:Obj-C 基本语法
- obj-c 语法小结
- css基础语法第二讲
- 第二讲:APDL语法基础
- OBJ-C实例变量修饰符;私有变量;私有方法;description;多态;点语法学习笔记
- 第三讲:属性,点语法
- C语言第二讲
- 第七讲:Obj-C 协议 Protocol
- 第十讲:Obj-C Blocks 应用
- obj-c编程09:块的语法
- WEB_03_JavaScript_JS基本语法_第二讲
- scala第二讲:helloworld的脚本语法
- 第二讲:c/c++数据类型
- Objective-C点语法
- objective-c 点语法
- 【Objective-C】点语法
- Objective-C 【点语法】
- ECMALL注册(邮箱或手机验证)
- 动态合并单元格
- 一个类的实例化对象所占空间的大小?
- js调用ocx控件
- C语言中的二级指针(双指针)
- 第二讲:Obj-C 点语法
- BP神经网络的数学公式推敲
- CADS Config
- 第三讲:Obj-C 内存管理1 - 黄金法则
- winpcap截获HTTP代码
- 如何屏蔽开始菜单
- 读 当世界无法改变时改变自己
- 第四讲:Obj-C 内存管理2 - retain / copy
- Data Guard 之表误操作恢复