OC第五节 ——点语法和@property
一、setter和getter函数
1.回忆:如何访问对象中的成员变量
2.setter和getter函数的作用
setter 方法: 修改对象的字段/实例变量
getter 方法: 读取对象的字段/实例变量
setter 方法: 可以带有多个参数,可以同时给多个变量赋值
getter方法: 不带参数,只能返回一个变量的值。
3.setter和getter如何命名
setter 方法的命名:
xxxx: 表示的是成员变量的名字
//带有一个参数
- (void)setXxxx:(参数类型)参数1;
//带有多个参数
- (void)setXxxx:(参数类型)xxxx andXxxx:(参数类型)xxxx......;
getter 方法的命名:
- (返回值类型)xxxx;
=======================================
二、点语法
1.为什么要设计点语法
为了方便别的程序员转到OC上面来, C ++, jave ,c# 都是使用的点语法 为了让程序设计简单化
隐藏了内存管理细节
隐藏了多线程、同步、枷锁细节
2.点语法的作用
属性可以在不适用括号的情况下使用点语法
无需调用[foo value] 可以调用foo.value 来访问. 注意跟结构体的区别
虽然foo.value 看起来像是直接访问value变量,但是属性始终调用
方法,而这些方法又可以访问对象的数据。
3.点语法的调用
xiaohong.name = @“xiaohong”;这里实际上调用的是setter方法。
NSString *nameString = xiaohong.name; 这里实际上调用的是getter方法。
4.点语法和setter/getter函数的关系
@interface QFDog: NSObject
{
NSInteger _age;
}
- (void)setAge:(NSInteger)newAge;
- (NSInteger)age;
@end
@implementation QFDog
- (void)setAge:(NSInteger)newAge
{
_age = newAge;
}
- (NSInteger)age
{
return _age;
}
@end
int main(void)
{
QFDog *dog = [[QFDog alloc] init];
[dog setAge:10];
NSInteger dogAge = [dog age];
dog.age = 20;
NSInteger dogAge1 = dog.age;
return 0;
}
【注】
【点语法和[]写法】
本质一样,同样是发送set和get消息,只不过写法不同。
点语法:
对象指针.实例变量;
如果是赋值
对象指针.实例变量 = xxxx;
展开成: [对象指针 setXxxx: xxxx];
如果是取值:
xxxx = 对象指针.实例变量;
展开成: [对象指针 实例变量];
dog.name = @“xiaobai”;
展开成: [dog setName: @“xiaobai”];
NSString *nameString = dog.name;
展开成: NSString *nameString = [dog name];
能够使用点语法的条件:
1、必须实现set和get方法
2、只能用于实例化的变量的赋值和取值
3、能使用点语法的赋值,对应的set方法只能够带有一个参数
#import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
NSInteger _age;
NSString *_identical;
}
- (void)setName:(NSString *)name;
- (NSString *)name; - (void)setAge:(NSInteger)age;
- (NSInteger)age; - (void)setIdentical:(NSString *)identical;
- (NSString *)identical;
@end #import "Person.h" @implementation Person
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
- (void)setAge:(NSInteger)age
{
_age = age;
}
- (NSInteger)age
{
return _age;
} - (void)setIdentical:(NSString *)identical
{
_identical = identical;
}
- (NSString *)identical
{
return _identical;
}
@end #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[])
{ @autoreleasepool { Person *p = [[Person alloc] init];
p.name = @"李平";
//[p setName:(NSString *)]
NSString *nameStirng = p.name;
//NSString *nameStirng = [p name];
NSLog(@"name: %@", nameStirng); p.age = 10;
p.identical = @"12345678"; NSLog(@"age: %ld", p.age);
NSLog(@"identical: %@", p.identical); }
return 0;
}
property
#import <Foundation/Foundation.h> @interface MyPoint : NSObject
{
NSInteger _x;
NSInteger _y;
NSInteger _z;
NSString *_name;
}
@property NSInteger x, y, z;
// NSInteger _x;
// NSInteger _y;
// NSInteger _z; //展开成为下面的两行
//- (void)setX:(NSInteger)x;
//- (NSInteger)x; //@property NSInteger y;
//- (void)setY:(NSInteger)y;
//- (NSInteger)y; //@property NSInteger z;
//- (void)setZ:(NSInteger)z;
//- (NSInteger)z; @property NSString *name;
//- (void)setName:(NSString *)name;
//- (NSString *)name; - (void)test; @end #import "MyPoint.h" @implementation MyPoint
//@synthesize x; //首先会去实例变量列表查找x, 如果没有x, 生成x
@synthesize x = _x; //和成员列表的_x 进行关联
@synthesize y = _y; - (void)test
{
// NSLog(@"x = %ld", x);
NSLog(@"_x = %ld", _x);
NSLog(@"_y = %ld", _y); } //- (void)setX:(NSInteger)x
//{
// _x = x;
//}
//
//
//- (NSInteger)x
//{
// return _x;
//} //如果自己实现了set和get方法,那么@synthesize就不会展开
//- (void)setY:(NSInteger)y
//{
// NSLog(@"------------");
// _y = y;
//}
//- (NSInteger)y
//{
// return _y;
//}
//
//
//
//- (void)setZ:(NSInteger)z
//{
// _z = z;
//}
//- (NSInteger)z
//{
// return _z;
//}
//
//- (void)setName:(NSString *)name
//{
// _name = name;
//}
//- (NSString *)name
//{
// return _name;
//}
@end #import <Foundation/Foundation.h>
#import "MyPoint.h"
int main(int argc, const char * argv[])
{ @autoreleasepool { MyPoint *point = [[MyPoint alloc] init]; point.x = 10;
point.y = 100; [point test];
NSLog(@"x : %ld, y: %ld", point.x, point.y); } return 0;
}
OC第五节 ——点语法和@property的更多相关文章
- OC self = [super init] , 点语法 , @property
OC self = [super init] , 点语法 , @property 构造方法为啥这么写? self = [super init]; [super init] 的结果可能有三种: 第一种: ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...
- 学习HTML 第五节.简单交互 加个按钮
学习HTML 第五节.简单交互 也许你和我一样,对页面排版的兴趣小于网页交互,那么我们就先略过一些章节,直接先学一下简单交互. 前面点击图片打开链接的网址,已经是最简单的交互方式了,复杂的方式则需要用 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 第五节:从一条记录说起——InnoDB记录结构
<MySQL 是怎样运行的:从根儿上理解 MySQL>第五节:从一条记录说起——InnoDB记录结构 准备工作 现在只知道客户端发送请求并等待服务器返回结果. MySQL什么方式来访 ...
随机推荐
- scala break & continue
Scala没有提供break和continue,我们可以自己实现一个,参考例子: import util.control.Breaks._ object BreakDemo { def main(ar ...
- 表x有 一列 ,程序每次生成id的时候都先从这里获取最大值再加1,初始值是A0001,然后到A9999的时候则是到B0001 共5位
drop table x gocreate table x(id varchar(10))--insert into x values('A001')gowith a as (select ISNUL ...
- beautifulsoup测试
import re from bs4 import BeautifulSoup html_doc = """ <html><head><ti ...
- AspectJ基础学习之三HelloWorld(转载)
AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...
- 删除ibus之后导致系统设置进不了
sudo apt-get instal ubuntu-desktop 快捷键调出sogou拼音,默认为"ctrl+,"
- Java 9.10习题
<1>设计4个线程对象,两个线程执行减操作,两个线程执行加操作 //================================================= // File Na ...
- QT 初阶 第二章 创建对话框(查找对话框实例)
最终效果图: 该对话框由三个文件组成:finddialog.h .finddialog.cpp. main.cpp 代码+注释 /*--finddialog.h--*/ #ifndef FINDDIA ...
- 改造rm命令为mv
:刚在群里面看到小伙伴误操作把服务器上重要的文件给删掉了,于是google了下,找到一篇文章把rm命令改造成mv命令,源博客如下:http://blog.csdn.net/dataspark/arti ...
- JAVA属性和成员的可见性
- Python 文件读写,条件循环(三次登录锁定账号实例)
通过文件读写,条件循环相关语法,实现三次登录失败则锁定该账号的功能 需求一 """需求描述: 1.输入正确账号,密码,退出程序 2.登录失败,重新输入账号密码 3.同一账 ...