OC学习那些事:点语法
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学习那些事:点语法的更多相关文章
- OC学习那些事:第一个OC类
一.创建一个新的OC类: 1.点击File->New File,打开Choose a template for your new file窗口,选择Objective-C class,点击Nex ...
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- OC self = [super init] , 点语法 , @property
OC self = [super init] , 点语法 , @property 构造方法为啥这么写? self = [super init]; [super init] 的结果可能有三种: 第一种: ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- JSP的学习(3)——语法知识二之page指令
本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...
- JSP的学习(2)——语法知识一
上一篇<JSP的学习>讲述了JSP的一些基础知识和底层原理,本篇将来学习JSP所需掌握的语法知识等. JSP的语法主要包括以下几个部分的内容: 1) JSP模板元素 2) ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- OC学习16——对象归档
转载自 OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
随机推荐
- virtualBox文件共享
具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...
- Easyui + jQuery表单提交 给 Controller patr1
2014-11-15 总结上周在公司开发所用到的技术,由于是刚找的工作(一个大三实习生)+自己的技术菜,有很多地方都是怎么想就怎么实现的, 如果你有什么更好的解决方法,在看见这篇博客的时候,希望你能 ...
- Java之工厂模式
interface Fruit { void eat(); } class Apple implements Fruit { public void eat() { S ...
- Linux内核和驱动编译常见问题
1.获取内核源码应为 git clone depth=1 不然编译时会报错 2.有些RTL188CUS网卡与wpa_supplicant兼容有问题 更新wpasupplicant或许能解决 这里用i ...
- IOS 特定于设备的开发:Core Motion基础
Core Motion框架集中了运动数据处理.该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问.它提供了对3个关键的机载传感器的集中式监测.这些传感器有陀螺仪.磁力计 ...
- Windows 安装 psutil
第一步:下载pustil 网址:https://pipy.python.org (http://yunpan.cn/cJg8aQpYwqfzh (提取码:7fa7)) 第二步:安装这个就没有什么好说 ...
- 精通 VC++ 实效编程280例 - 01 窗口
窗口是屏幕上的一个矩形区域.窗口分为3种:重叠窗口.弹出窗口和子窗口.每个窗口都有由系统绘制的“非客户区”和应用程序绘制的“客户区”.在 MFC 中,CWnd 类为各种窗口提供了基类. 1 通过 HW ...
- solaris 操作系统配置联网
1. 设置主机名: etc/hostname.vmxnet0 hannick 2.设置主机名和ip地址的映射: etc/hosts 127.0.0.1 localhost 192.108.1.123 ...
- 远程登录阿里云上的MySQL
近期对云和server之类的感兴趣,想要将自己的数据什么的保存到远端server.研究了阿里云和百度云.今天算是有点进步吧. 我在阿里云上申请了个免费的云server(ECS),非常可惜仅仅能用5天. ...
- openstack 源码分析
Nova对于底层Hypervisor(如KVM/QEMU等)的调用与管理主要通过LibvirtDriver类,nova/virt/libvirt/driver.py Libvirt对Hyperviso ...