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的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. Objective C运行时(runtime)

    #import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...

  3. 刨根问底Objective-C Runtime

    http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...

  4. Objective C运行时(runtime)技术的几个要点总结

    前言:          Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...

  5. Objective C静态代码扫描和代码质量管理 OClint + SonarQube

    OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台.本文将实现将OClint的扫描结果导入到SonarQube中,已实现对O ...

  6. Objective C Runtime 开发介绍

    简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...

  7. C++ vs Objective C

    oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...

  8. Objective C运行时(runtime)技术总结,好强大的runtime

    前言:          Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...

  9. Objective -C Categories

    Objective -C Categories  The dynamic runtime dispatch mechanism employed by Objective-C lets you add ...

  10. spring无法读取properties文件数据

    只讲述异常点,关于怎么配置文件,这里不做说明.   1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...

随机推荐

  1. my.cnf配置详解[转载]

    先粘贴一份mac下的mysql5.6.22的配置文件 # Example MySQL config file for medium systems. # # This is for a system ...

  2. JSON with Java

    work with json-lib.jar import net.sf.json.JSONArray;import net.sf.json.JSONException;import net.sf.j ...

  3. ajax跨域问题解决(spring boot)

    之前用的服务器响应头部添加Access-Control-Allow-Origin: *来解决的 public static void setResp(HttpServletResponse resp) ...

  4. ABAP FORM打印转PDF/pdf 预览

    function ZSTXBC_SSFCOMP_PDF_PREVIEW. *"-------------------------------------------------------- ...

  5. YTU 2559: “心脏出血”

    2559: "心脏出血" 时间限制: 1 Sec  内存限制: 128 MB 提交: 5  解决: 2 题目描述 2014年4月,一个开源加密库OpenSSL的严重漏洞" ...

  6. Gerrit代码Review实战

    代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...

  7. 【WebRTC音频预处理单元APM的整体编译及使用 - android】

    前言 在写[单独编译使用WebRTC的音频处理模块 - android]一文之前,就一直想直接把WebRTC的音频处理引擎VoE整个儿编译出来供自己的项目使用,但限于技术拙劣.时间紧迫,所以没能成功. ...

  8. zoom和transform scale

    一.zoom zoom的字面意思是“变焦”,摄影的时候常用到的一个概念.对于web上的zoom效果,你也可以按照此概念理解.可以改变页面上元素的尺寸,属于真实尺寸. 在旧的web时代.*zoom: 1 ...

  9. Entity Framework 学习整理

    MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...

  10. Sql Server 查询重复记录

    参考网址:http://database.51cto.com/art/201103/250046.htm SQL Server数据库多种方式查找重复记录 select * from dbo.T0058 ...