博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二讲:Obj-C 点语法
阅读量:5094 次
发布时间:2019-06-13

本文共 4821 字,大约阅读时间需要 16 分钟。

转:

第二讲:Obj-C 点语法 

2012-12-12 09:29:55|  分类: |  标签:  |字号

主要内容
      为什么需要点语法、点语法的好处是什么。
      @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

*/

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
总结
第二讲:Obj-C 点语法 - tigercat1977 - tiger notes
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;
      目的是避免函数名和字段重复
第二讲:Obj-C 点语法 - tigercat1977 - tiger notes
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 函数名
第二讲:Obj-C 点语法 - tigercat1977 - tiger notes
举例子  (@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
*/

 

 

转载于:https://www.cnblogs.com/jackljf/archive/2013/03/07/3589254.html

你可能感兴趣的文章
python中super用法
查看>>
WCF 错误 给定关键字不在字典中
查看>>
JAVA中反射机制
查看>>
Python学习笔记(十)—— 高级特性
查看>>
Java基础之String,StringBuilder,StringBuffer
查看>>
SSH框架整合 spring struts2 hibernate
查看>>
测试Location对象的Hash属性
查看>>
Python之路,第十五篇:Python入门与基础15
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
JavaScript学习总结
查看>>
Linux常用命令
查看>>
Spring Boot2.0 整合 Kafka
查看>>
GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3
查看>>
在你自己的时区里,一切安排都准时!
查看>>
软件测试技术- 自动贩卖机-因果图&决策图
查看>>
CSS3 Box-sizing
查看>>
并发编程:守护进程、互斥锁、案例、进程间通讯
查看>>
如何使带背景图片的Button按钮中的文字居中偏上显示
查看>>
memcache、redis、mongoDB 如何选择?
查看>>