1.使用自定义的方法创建get/set方法

Person.h文件:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int age;
}
-(void)setAge:(int)newAge;//方法名是setAge:
-(int)age;//方法名是age
//-(void)setAge:(int)newAge AndNo:(int)no;//方法名是setAge:AndNo:
@end

Person.m文件:

#import "Person.h"
@implementation Person
-(void)setAge:(int)newAge
{
age = newAge;
}
-(int)age
{
return age;
}
@end

main.m文件:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *person = [[Person alloc]init];
[person setAge:10];
int age = [person age];
NSLog(@"age is %i",age);
[person release];
}
return 0;
}

2.使用点语法访问成员

2.1在OC中点语法不是访问成员变量,而是隐式调用get/set方法:

  • person.age = 10等效于[person setAge:10];

  • int age = person.age等效于[person age];

Person *person = [[Person alloc]init];
//使用点语法访问成员和设置成员变量
person.age = 10;
int age = person.age;
NSLog(@"age is %i",age); 

2.2通过在get/set方法中打印数据(或设置断点的方式),可以观察到方法的调用。

-(void)setAge:(int)newAge
{
NSLog(@"调用了setAge方法:%i",newAge);
age = newAge;
}
-(int)age
{
NSLog(@"调用了age方法:%i",age);
return age;
}

运行代码的输出为:

2013-07-18 23:23:59.946 点语法[2314:303] 调用了setAge方法:10

2013-07-18 23:23:59.967 点语法[2314:303] 调用了age方法:10

2013-07-18 23:23:59.968 点语法[2314:303] age is 10

2.3注意,OC中,为了防止self.age误认为是访问成员变量age,所有的成员变量,推荐使用_age。

@interface Person : NSObject
{
int _age;
}

2.4setAge方法中和age方法中的错误写法:

-(void)setAge:(int)newAge
{
NSLog(@"调用了setAge方法:%i",newAge);
self.age = newAge;
}

不能在setAge:方法中使用self.age = newAge,相当于在setAge:方法中调用[self setAge:newAge],出现死循环,输出:

2013-07-18 23:33:22.277 点语法[2336:303] 调用了setAge方法:10

2013-07-18 23:33:22.279 点语法[2336:303] 调用了setAge方法:10

2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10

2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10

-(int)age
{
NSLog(@"调用了age方法:%i",_age);
return self.age;
}

不能在age方法中使用return self.age,相当于return [self age];,出现了死循环,输出:

2013-07-18 23:36:30.506 点语法[2364:303] 调用了age方法:10

2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10

2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10

2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10

3.经过上面的学习,我们正规的写法应该是如下:

Person.h文件:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
//1.使用_age声明成员,方式self.age访问成员变量的误解
int _age;
} -(void)setAge:(int)newAge;
//2.使用age成员的名称,命名get方法
-(int)age;
@end

Person.m文件:

#import "Person.h"
@implementation Person
-(void)setAge:(int)newAge
{
_age = newAge;
}
-(int)age
{
return _age;
}
@end

main.m文件:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *person = [[Person alloc]init];
//3.使用self.age语法,隐式的调用get/set方法
self.age = 10;
int age = self.10;
NSLog(@"age is %i",age);
[person release];
}
return 0;
}

OC学习那些事:点语法的更多相关文章

  1. OC学习那些事:第一个OC类

    一.创建一个新的OC类: 1.点击File->New File,打开Choose a template for your new file窗口,选择Objective-C class,点击Nex ...

  2. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  3. OC self = [super init] , 点语法 , @property

    OC self = [super init] , 点语法 , @property 构造方法为啥这么写? self = [super init]; [super init] 的结果可能有三种: 第一种: ...

  4. OC学习总结之面向对象和类

    OC学习总结之面向对象和类   Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象 ...

  5. JSP的学习(3)——语法知识二之page指令

    本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...

  6. JSP的学习(2)——语法知识一

    上一篇<JSP的学习>讲述了JSP的一些基础知识和底层原理,本篇将来学习JSP所需掌握的语法知识等. JSP的语法主要包括以下几个部分的内容: 1)         JSP模板元素 2)  ...

  7. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  8. OC学习16——对象归档

    转载自  OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...

  9. OC学习11——循环引用与@class

    转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...

随机推荐

  1. ROS中编辑文件命令行工具rosed

    rosed是rosbash套件中的一个,它允许我们通过包名直接编辑包中的文件,而不是输入包的全部路径. 用法: rosed [package_name] [filename] 例如: rosed ro ...

  2. 对discuz的代码分析学习(一)目录结构

    主目录 DISCUZ用的是自己的框架,和其他框架应用一样属于单入口应用.主目录下的.php文件,大部分是应用的入口文件. home.php:家园入口,即论坛中类似博客的那个东西.index.php:首 ...

  3. bzoj 1066 : [SCOI2007]蜥蜴 网络流

    题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...

  4. [C++]Store Credit——Google Code Jam Qualification Round Africa 2010

    Google Code Jam Qualification Round Africa 2010 的第一题,很简单. Problem You receive a credit C at a local ...

  5. [Java]使用队列求解josephus问题

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过个人(因为第一个人已 ...

  6. Windows Server 2012 R2 Standard序列号

    备用一个吧,免得用起来的时候找不到. NB4WH-BBBYV-3MPPC-9RCMV-46XCB

  7. 迭代器(iterators)

    1.迭代器的概念 迭代器是一种抽象的设计概念.在设计模式中,迭代器模式定义为:提供一种方法,使之能够依序访问某个容器中所含的各个元素,而又无需暴露该容器的内部组织结构. 迭代器可以看做一种行为类似指针 ...

  8. (Android) ContentProvider 实例

    ContentProvider 用于应用程序(Android Application)之间传递数据,包括Insert, update, delete, query. 下面的例子是在两个应用之间传递数据 ...

  9. Delegation事情委托或代理

    在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...

  10. 【Oracle】RAC添加新节点

    RAC添加节点: 环境: OS:OEL5.6 RAC:10.2.0.1.0 原有rac1,rac2两个节点.如今要添加rac3节点: 操作过程: 改动三个节点上的/etc/hosts文件 192.16 ...