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. 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释

    BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...

  2. android 怎样将主菜单图标改成按安装时间排序

    1. 在 LauncherModel.java 中增加例如以下代码, 假设是KK Launcher3 ApplicationInfo要替换为AppInfo public static final Co ...

  3. iOS开发——高级篇——FMDB 数据库简单使用

    #import <Foundation/Foundation.h> @interface UserDB : NSObject // 把userDB设计成一个单例类 + (id)shareI ...

  4. HDU 5274 Dylans loves tree 树链剖分+线段树

    Dylans loves tree Problem Description Dylans is given a tree with N nodes. All nodes have a value A[ ...

  5. swift中的@objc的作用

    转载:https://www.jianshu.com/p/6c5b45d9d042 自动清除冗余代码减小包大小 得益于 Swift 的静态语言特性,每个函数的调用在编译期间就可以确定.因此在编译完成后 ...

  6. linux下nginx模块开发入门

    本文模块编写参考http://blog.codinglabs.org/articles/intro-of-nginx-module-development.html 之前讲了nginx的安装,算是对n ...

  7. Webdriver中关于driver.navigate().to()和driver.get()使用的区别

    先是有一个父页上button弹开一个子页,总共有4个子页,必须前一个页上的必填信息录完,才能在这个页面触发下一个子页. 用driver.navigate().to(baseUrl2),直接跳转到第2个 ...

  8. 视图表单访问控制器操作方法的POST、GET方式对应关系

    在视图中,表单默认访问方式是FormMethod.Post(不会将请求显示在地址栏中).在控制器中,操作方法不标注属性,默认为HttpGet属性.会有以下情况出现. 1.表单不指定访问方式(默认形式为 ...

  9. 01_创建一个新的activity&activity配置清单文件

    今天开始学四大组件.今天是学Activity,然后是广播接收者,然后是服务,然后是内容提供者.四大组件,咱们一天一个.Activity就是跟用户交互的界面,大部分的应用都不会只有这么一个界面.创建多个 ...

  10. Github个人主页不显示提交记录的问题

    最近发现自己连续三天在github上的提交没显示在个人主页上,一番搜索后终于发现原来是因为没有把git的配置改过来,提交的代码时使用了不同的email. https://code.bradymower ...