Objective-C Properties
Objective-C Properties
Apple introduced properties, a combination of new compiler directives
and a new attribute accessor syntax.
Apple 引入了属性这一概念。新的编译器命令和新的属性存取句法。
1.1 Shrinking the Interface 减少interface代码
@property float rainHandling; says that objects of the class AllWeatherRadial have an attribute, of type float, called rainHandling. It also says that you can set the property by calling –setRainHanding: and that you can access the attribute by calling -rainHandling.
@property float rainHandling;这个说明这个对象有一个类属性,是float 类型,名字为rainHandling 。同样,你能够通过调用setRainHanding 设置属性值。
1.2 Shrinking the Implementation
@synthesize rainHandling;
@synthesize snowHandling;
@synthesize is a compiler feature that says "create the accessors for this attribute."
@ synthesize是编译器特色,说创建这个属性的获取。
@synthesize is not code generation. You won't ever see the code that implements –setRainHandling: and –rainHandling, but these methods will exist and will be callable.
@synthesize 不是代码生成器。但是这项方法存在,且能被调用。
If you provide the methods in your class for the property, the compiler doesn't create them. The compiler only creates methods that are missing.
如果你提供了这个属性的一个方法,那么compiler将不创建这些方法。compiler
只创建缺失的方法。
Most properties are backed by a variable, so when you synthesize the getter and setter, the compiler automatically creates an instance variable with the same name as the property.
大部分properties 返回一个variable ,所以当你同步getter 和setter方法的时候,compiler 自动创建了与这个属性名字相同的实例变量。
Notice that the header file has two variables called rainHandling and snowHandling. The setter and getter will use these variables. If you don't declare those variables, the compiler creates them.
注意头文件有两个变量,如果没写的话,compiler将自动添加这两个方法。
1.3 Dot notation
The dot notation looks a lot like structure access in C and object access in Java—on purpose.
点运算符想存储在C和对象存取在java中一样
1.4 Objecting to Properties 对象 对于属性
Objects bring some added complications.
对象让事情麻烦了。
Recall that we retain and release objects as they flow through our accessors.
当他们要经过accessor时,我们retain 和release 对性。
For some object values, particularly string values, you want to always -copy them. Yet for other object values, like delegates (which we'll talk about in the next chapter), you don't want to retain them at all.
像string你想copy 它,而对于delegate ,你却不想retain 他们。
@property (copy) NSString *name;
@property (retain) Engine *engine;
You can use some other decorations, like nonatomic, which makes accessors a bit faster if they won't be used in a multithreaded environment.
如果 他们不用在多线程环境,nonatomic 使得accessor更快,
s. You can also use assign if you don't want the attribute object to be retained, to help avoid retain cycles.
如果你不想属性对象被retained ,那么我们将尽量避免retian 循环。
You can only specify retain and copy attributes for retainable pointers (i.e. Objective-C objects). All other types, such as C and nonretainable pointers, must use assign and manage memory manually.
If you provide either or both the setter and getter yourself, you cannot use atomic attribute; you must use nonatomic.
如果你自己写了setter 或getter方法中任意一个,那么你不能用atomic 属性,必须使用nontomic 属性。
1.5 Appellation spring 别名
the name of the property has been the same as the name of an instance variable that backs that property.
一般情况下,property的名字应该和返回的property的实例变量名字一样。
Sometimes, though, you may want one name for the instance variable and another for the public attribute name.
但是有些时候你想让实例变量一个名字,而公共属性名字为另一个。
@interface Car : NSObject
{
NSString *appellation;
NSMutableArray *tires;
Engine *engine;
}
@property (copy) NSString *name;
@property (retain) Engine *engine;
and then change the synthesize directive: @synthesize name = appellation;
In init, change
name = @"Car";
to
self.name = @"Car";
What's that self-dot-name business? It's a bit of disambiguation to let the compiler know that we want to vector through the accessors. If we just use a naked name, the compiler assumes that we're directly modifying an instance variable. To go through the accessors, we can write [self setName:@"Car"]. Remember that the dot is just shorthand for making this exact same call, so self.name = @"Car" is just another way of saying the same thing.
只是为了去除歧义。
1.6 Read-Only About It只读
You might have an object with an attribute that is read-only.
有一些属性你允许它只能读。
You can code for these situations with more attributes on @property.
你可以在@property中加attribute
By default, properties are mutable: you can read and write them. Properties have a readwrite attribute you can use for specifying this.
默认情况下,properties 是可变的。你能读和写他们。
@property (readonly) float shoeSize;
@property (readonly) NSString *licenseNumber;
When the compiler sees that @property is readonly, it generates a getter but not a setter for that attribute.
当compiler 看到@property 只读时,应该只产生getter方法,而不产生setter 方法。
1.7
What if you'd rather not have a variable, getter, and setter for your property?
如果你getter 和setter方法都不想要的话怎么办?
You can use the keyword @dynamic to tell the compiler not to generate any code or create a variable for the property.
你可以用关键则@dynamic 来告诉编译器不产生任何代码。
@property (readonly) float bodyMassIndex;
@dynamic bodyMassIndex;
- (float)bodyMassIndex
{
///compute and return bodyMassIndex
}
1.8 chang the method name
you might not like the names of the methods that are generated by default. They're in the form of blah and setBlah:.
有时候你想用自己的方法名字。
To overcome this, you can specify the names of the getter and setter that the compiler generates. Use the attributes getter= and setter= to define the preferred names of your methods.
为此,你应该在@property设置getter= and setter attribute .
@property (getter=isHidden) BOOL hidden;
1.9 properties 并不是无所不能
- (void) setTire: (Tire *) tire atIndex: (int) index;
- (Tire *) tireAtIndex: (int) index;
these methods don't fit into the fairly narrow range of methods that properties cover. Properties will let you replace only –setBlah and –blah methods, but not methods that take extra arguments, like the tire's position on the car.
上面的方法并不适合properties .因为属性仅仅允许你替换setter和getter 方法不带参数的部分。
Objective-C Properties的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective C运行时(runtime)
#import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...
- 刨根问底Objective-C Runtime
http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...
- Objective C运行时(runtime)技术的几个要点总结
前言: Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...
- Objective C静态代码扫描和代码质量管理 OClint + SonarQube
OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台.本文将实现将OClint的扫描结果导入到SonarQube中,已实现对O ...
- Objective C Runtime 开发介绍
简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...
- C++ vs Objective C
oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...
- Objective C运行时(runtime)技术总结,好强大的runtime
前言: Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...
- Objective -C Categories
Objective -C Categories The dynamic runtime dispatch mechanism employed by Objective-C lets you add ...
- spring无法读取properties文件数据
只讲述异常点,关于怎么配置文件,这里不做说明. 1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...
随机推荐
- Chapter1-data access reloaded:Entity Framework(下)
1.4 Delving deep into object/relational differences 深入挖掘对象关系的不同 理解面向对象和关系世界的不同是重要的,因为他会影响你设计一个对象模型或者 ...
- 【bzoj2809】[Apio2012]dispatching (左偏树)
我们需要枚举根,然后从其子树内选尽量多的点,薪水不超过M,可是暴力复杂度不对.于是考虑自下而上合并树(开始每棵树内只有一个节点,就是自己) 每个树是一个堆,我们维护树的节点个数和薪水总和,合并时,不断 ...
- Win7下安装iMac系统
首先是灰常激动啊,一下午的努力最终在自己华硕的笔记本上安装了mac系统. 先上一个成果截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXl4aGh4/ ...
- SE11 数据表中 日志数据更改 勾选的作用
[园工]HF-abap-Rainy(574570549) 11:10:12这个有啥作用,勾上了怎么查修改日志呢,[园丁]SH-CRM-ALEX(8738890) 11:13:53SCU3[ ...
- centos7和redhat7的比特币环境搭建
比特币版本是 bitcoin-0.12 问题1: [root@localhost bitcoin-master]# ./autogen.sh which: no autoreconf in (/us ...
- Lucene dvd dvm文件便是docvalues文件——就是针对field value的列存储
public final class Lucene54DocValuesFormat extends DocValuesFormat Lucene 5.4 DocValues format. Enco ...
- VMware 12PRO安装Mac OS X 10.10.5
插件安装 步骤一完成后,打开任务管理器,找到服务项,选择按名称排序,将框中四项全部停止运行. 然后打开下载的插件,解压unlocker206.zip文件,找到 unlocker206\win-in ...
- html5 canvas+js实现ps钢笔抠图(速抠图 www.sukoutu.com)
html5 canvas+js实现ps钢笔抠图(速抠图 www.sukoutu.com) 根据html5 canvas+js实现ps钢笔抠图的实现,aiaito 开发者开发了一套在线抠图工具,速抠 ...
- ES6躬行记(23)——Promise的静态方法和应用
一.静态方法 Promise有四个静态方法,分别是resolve().reject().all()和race(),本节将着重分析这几个方法的功能和特点. 1)Promise.resolve() 此方法 ...
- HDU1180:诡异的楼梯
传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...