obj-c编程02:给类自动合成存取方法
我们在此篇对obj-c编程01中的Box的例子稍加改动,一是添加的自动合成存取器,二是将Box按照其标准的写法分成3个文件,即头文件Box.h,类实现文件Box.m,以及主文件test.m.
1.Box.h
#import <Foundation/Foundation.h> @interface Box:NSObject{ int l; int w; } @property int l,w; -(void)print; @end
2.Box.m
#import "Box.h" @implementation Box @synthesize l,w; -(void)print{ NSLog(@"l=%d,w=%d",l,w); } @end
3.test.m
#import "Box.h" int main(int argc,char **argv) { @autoreleasepool { NSLog(@"hello class! :)"); Box *box = [[Box alloc] init]; [box setL:100]; [box setW:200]; NSLog(@"look box :"); [box print]; NSLog(@"other way to look box : l=%d,w=%d",[box l],[box w]); } return 0; }
编译命令和执行结果为:
wisy@wisy-ThinkPad-X61:~/src/objc_src/class_std$ clang -O3 -g0 -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fgnu-runtime -fconstant-string-class=NSConstantString -I. -I/home/wisy/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep -lobjc -lgnustep-base -o cls_test Box.m test.m wisy@wisy-ThinkPad-X61:~/src/objc_src/class_std$ ./cls_test2014-06-28 13:53:35.666 cls_test[16916] hello class! :) 2014-06-28 13:53:35.668 cls_test[16916] look box : 2014-06-28 13:53:35.668 cls_test[16916] l=100,w=200 2014-06-28 13:53:35.668 cls_test[16916] other way look box : l=100,w=200
我开始在@interface中没有实例变量的定义,结果编译报错了:
Box.m:4:14: error: synthesized property 'l' must either be named the same as a compatible instance variable or must explicitly name an instance variable @synthesize l,w; ^ Box.m:4:16: error: synthesized property 'w' must either be named the same as a compatible instance variable or must explicitly name an instance variable @synthesize l,w;
添加上后则正常,原因不明(书上说可以不加).另外要注意的是自动合成的写方法是SetL和SetW,别搞错了.
我们还可以简写读写合成器方法,甚至一般方法如下:
#import "Box.h" int main(int argc,char **argv) { @autoreleasepool { NSLog(@"hello class! :)"); Box *box = [[Box alloc] init]; [box setL:100]; [box setW:200]; box.l = 101; //same as [box setL:101] box.w = 102; //same as [box setW:102] NSLog(@"look box :"); [box print]; (void)box.print; //same as [box print] NSLog(@"other way to look box : l=%d,w=%d",[box l],[box w]); NSLog(@"other way to look box : l=%d,w=%d",box.l,box.w); //same as [box l],[box w] } return 0; }
第17行前面加了(void)告诉编译器我不关心print有没有返回,如果不加会有警告:
test.m:17:3: warning: property access result unused - getters should not be used for side effects [-Wunused-value] box.print; ^~~~~~~~~
原则上一般方法不用这种方式调用,还是用一般的[ ]为妥哦.
[2014.07.03第1次添加内容]:属性的原子关键字
我们往往可以在源代码中看见如下的写法:
@property(nonatomic,copy)Some_class *obj;
其中copy关键字可以在后面的第11,12篇中得到解答,这里简单说说前者。此处使用nonatomic是为了告诉系统不要使用互斥(mutex)锁来保护属性的存取方法,这在编写单线程的代码中会用的到。如果是在多线程中且需要同步安全,则不能指定nonatomic或者可以指定atomic(默认值)关键字,这时系统可以帮我们自动加上互斥代码保证多线程同步安全喽。
[2014.07.05第1次修改]:nonatomic特性的展开
在使用nonatiomic特性的代码实际中是如何展开的呢?如下:
{
[threadLock lock];
//use val
[threadLock unlock];
}
[2014.07.05第2次添加内容]:属性与同步语法的扩展
在前面介绍的属性和同步语法还有其他的变形形式哦,我们可以在声明属性时只定义读者方法或写者方法,还可以改变读者或写者方法的名字;在后面的同步中,我们还可以改变与属性绑定的实例变量哦:
下面上代码,相信一目了然:
#import<Foundation/Foundation.h> #define msg(...) NSLog(__VA_ARGS__) @interface Foo:NSObject{ int _idx; NSString *_name; } @property (getter=idx_r,setter=idx_w:) int idx; @property (retain)NSString *name; -(NSString*)description; @end @implementation Foo @synthesize idx=_idx,name=_name; -(NSString*)description{ return [NSString stringWithFormat:@"_idx:%d,idx:%d,_name:%@,name:%@",\ _idx,self.idx,_name,self.name]; } @end int main(int argc, char *argv[]){ @autoreleasepool { Foo *foo = [[Foo alloc] init]; [foo idx_w:101]; [foo setName:@"helo foo!"]; msg(@"%d %@ %@",[foo idx_r],[foo name],foo.name); msg(@"%@",foo); } return 0; }
编译运行结果如下:
wisy@wisy-ThinkPad-X61:~/src/objc_src$ clang -objc-arc -O3 -g0 $OBJC_OPTS -lobjc -lgnustep-base -o 1 1.m wisy@wisy-ThinkPad-X61:~/src/objc_src$ ./1 2014-07-05 10:36:46.143 1[3576] 101 helo foo! helo foo! 2014-07-05 10:36:46.146 1[3576] _idx:101,idx:101,_name:helo foo!,name:helo foo!
其实和@synthesize类似,还有一个同步关键字@dynamic,使用该关键字生成的存取方法要手动写方法哦,这样你对存取方法会有更大的自由度哦!
obj-c编程02:给类自动合成存取方法的更多相关文章
- Python编程-面向对象和类
一.面向对象的程序设计 1.面向过程 VS 面向对象 (1)编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组 ...
- [.net 面向对象编程基础] (9) 类和类的实例
[.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...
- 编程实现Windows系统自动登录
编程实现Windows系统自动登录 原理: 通过注册表修改实现.Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码, ...
- PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置
一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...
- 《挑战30天C++入门极限》C++面向对象编程入门:类(class)
C++面向对象编程入门:类(class) 上两篇内容我们着重说了结构体相关知识的操作. 以后的内容我们将逐步完全以c++作为主体了,这也意味着我们的教程正式进入面向对象的编程了. 前面的教程我 ...
- 并发编程--Concurrent-工具类介绍
并发编程--Concurrent-工具类介绍 并发编程--Concurrent-工具类介绍 CountDownLatch CylicBarrier Semaphore Condition 对象监视器下 ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- day40-网络编程02
Java网络编程02 4.TCP网络通信编程 基本介绍 基于客户端--服务端的网络通信 底层使用的是TCP/IP协议 应用场景举例:客户端发送数据,服务端接收并显示控制台 基于Scoket的TCP编程 ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
随机推荐
- 如何使用《DB 查询分析器》高效地生成旬报货运量数据
如何使用<DB 查询分析器>高效地生成旬报货运量数据 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 1 引言 中国本土 ...
- Android开发 无法导入ViewPagerIndicator或其他开源框架无法导入
这个问题又花费了好长时间,其实就是很简单的问题,因为各种开源框架的库名称都叫liberary,如果上次导入其他开源框架没有更改名称的话,你再导入其他第三库的时候,系统发现重名,就提示无法导入现象. 解 ...
- Android上下文菜单ContentView详解
ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于 ...
- 12 SharedPreferences
SharedPreferences 创建方式 SharedPreferences preferences = getPreferences(Context context ,int mode); 参数 ...
- Editorial Board 、co-editor、ediitor、editor-in-chief的区别
昨天更新掘金APP-IOS之后发现一个比较严重的Bug,联系管理者报告了Bug,中途发现掘金的发布功能需要申请成为co-editor才行. 那么这里科普一下这几个名词: Editorial Board ...
- Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制. 好处: 1.将运行时的异常出现问题classcastException.转移到了编译时期.方便程序员调试解决问题,让运行事情问题减少, ...
- Android布局性能优化—从源码角度看ViewStub延迟加载技术
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码 ...
- Dynamics CRM 电子邮件服务器配置文件Advanced配置中关闭SSL
在新建电子邮件服务器配置文件时Advanced中的Use SSL for Incoming/Outgoing Connection默认都是启用的而且无法编辑,启用SSL当然是为了安全的考虑,但当客户的 ...
- Android开发学习之路--传感器之初体验
说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等.当然android手机之所以称为智能手机,少不了这几款传感器的功劳了.下面就学习下了,这里主要学习光照,加速度和磁. 新建工程emSenso ...
- 北大青鸟Asp.net之颗粒归仓
自从小编走进编程的世界以来,学习的编程知识都是和C/S这个小伙伴握手,直到做完牛腩老师的新闻发布系统,才开始了小编的B/S学习生涯,和B/S初次谋面,小宇宙瞬间爆发了,看着自己的第一个B/S系统,牛腩 ...