Objective-C入门教程03:属性(@property和@synthesize)

在Java中,特别是一个标准的POJO类,我们定义了一些属性,然后针对每个属性生成相应的getter和setter.例如:

package com.demo;

/**
 * 手机类
 * @author liuzc
 */
public class Phone {

	private String color;  //颜色
	private String os;     //系统
	private String brand;  //品牌

	/******* Getter & Setter *******/
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getOs() {
		return os;
	}
	public void setOs(String os) {
		this.os = os;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}

在Objective-C中,类的属性默认是protected的,也就是说只有该类以及它的子类才能存取它,如果要给外部使用的话,则需要来帮它加个setter/getter。使用Objective-C我们可以将上面的代码改写为:

@implementation Phone{
    NSString *color;
    NSString *brand;
    NSString *os;
}
-(NSString*) color{
    return color;
}
-(NSString*) brand{
    return brand;
}
-(NSString*) os{
    return os;
}
-(void) setColor:(NSString*) _color{
    color=_color;
}
-(void) setBrand:(NSString*) _brand{
    brand=_brand;

}
-(void) setOs:(NSString*) _os{
    os=_os;
}

@end

需要注意的是,在Objective C中,get有着特殊的含义,所以getter方法直接使用属性名,而不是使用get然后再加上属性名。上面仅仅只是三个属性,如果有10个、20个属性,是不是也需要写大量的代码呢?

Objective C 2.0 为我们提供了@property和@synthesize。它大大简化了我们创建数据成员读写函数的过程,更为关键的是它提供了一种更为简洁,易于理解的方式来访问数据成员。

上面的代码我们可以简化为:

Phone.h

@interface Phone : NSObject

@property NSString *color;
@property NSString *brand;
@property NSString *os;

@end

Phone.m

#import "Phone.h"

@implementation Phone

@synthesize color;
@synthesize brand;
@synthesize os;

@end

@property的语法:

其中attribute有如下几种取值,各个attribute的含义涉及到Objective-C中内存管理的相关知识,后面会有详细的讲解,所以这里只是简单的介绍.只有有Objective-C的内存管理有了比较全面的了解之后,才能很好的理解这里各个attribute的含义.

attribute主要分为三类:

  • 读写属性: (readwrite/readonly) 决定是否生成set访问器
  • setter语意 (assign/retain/copy)set访问器的语义,决定以何种方式对数据成员赋予新值。
  • 原子性:    (atomic/nonatomic)

readwrite:生成setter\getter方法 (默认)

readonly:只生成getter方法.

此标记说明属性是只读的,如果你指定了readonly,在@implementation中只需要一个getter。或者如果你使用@synthesize关键字,也只会生成getter方法。如果你试图使用点操作符为属性赋值,你将得到一个编译错误。readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

assign:简单赋值,不更改索引计数

此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain:释放旧的对象,将旧对象的值赋予输入对象,再增加输入对象的索引计数为1

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数)。

copy:建立一个索引计数为1的对象,然后释放旧对象

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。

atomic/nonatomic:

指出访问器不是原子操作,atomic表示属性是原子的,支持多线程并发访问,而默认地nonatomic,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。没有特别的多线程要求建议用 nonatomic 有助于提高性能。

在iOS5引入了自动引用计算(ARC)之后,对象变量属性新增了strong和weak,strong与retain作用类似,可以说是用来代替retain.

访问修饰符

Objective-C提供了3条指令来控制对一个对象的实例变量的访问:

@protected: 用此指令修饰的实例变量可以被该类和任何子类定的方法直接访问,这是默认情况。
@private:用此指令修饰的实例变量可以被定义在该类的方法直接访问,但是不能被子类中定义的方法直接访问。
@public:用此指令修饰的实例变量可以被该类中的方法直接访问,也可以被其它类定义的方法直接访问。

@package 关键字是在Mac 10.5 Objective-C runtime中新添加的,用以支持64-bit系统。

@package is a new instance variable protection class, like @public and @protected@package instance variables behave as follows:

  • @public in 32-bit;
  • @public in 64-bit, inside the framework that defined the class;
  • @private in 64-bit, outside the framework that defined the class.

In 64-bit, the instance variable symbol for an @package ivar is not exported, so any attempt to use the ivar from outside the framework that defined the class will fail with a link error.

时间: 2024-11-05 12:29:47

Objective-C入门教程03:属性(@property和@synthesize)的相关文章

Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

[转载]AngularJS入门教程03:迭代器

我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视着你的应用,并且在发生回归的时候迅速报告. 请重置工作目录: git checkout -f step-3 我们的应用现在有了一个搜索框.注意到页面上的手机列表随着用户在搜索框中的输入而变化. 步骤2和步骤3之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 控制器 我们对控制器不做

一步步AS400-Cobol 上手自学入门教程03 - 数据部(原创)

数据部的作用 程序中涉及到的全部数据(输入.输出.中间)都要在此定义,对它们的属性进行说明.主要描述以下属性: 数据类型(数值/字符)和存储形式(长度) 数据项之间的关系(层次和层号) 文件与记录的关系 数据部可以分为: 文件节(file section):用来描述程序中用到的输入输出文件及记录中各数据项的属性 工作单元节(working-storage section): 用来描述程序中用到的中间数据 联接节(linkage section):用来描述与调用程序间发生数据传递的数据项(即参数)

前端教程(9)css入门教程-css属性设置

一 字体属性 1.font-weight:文字粗细 取值 描述 normal 默认值,标准粗细 bord 粗体 border 更粗 lighter 更细 100~900 设置具体粗细,400等同于normal,而700等同于bold inherit 继承父元素字体的粗细值 2.font-style:文字风格 normal 正常,默认就是正常的 italic 倾斜 3.font-size:文字大小 fs:一般是12px或13px或14px 注意: 1.通过font-size设置文字大小一定要带单位

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件:中断系统使得内核具备了应对突发事件的能力. 在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行. 这种程序在执行过程中由于外界的原因而被中间打断的

Google Guice 入门教程

01 - 依赖注入 1. 依赖注入 1.1 类依赖注入 所谓的绑定就是将一个接口绑定到具体的类中,这样客户端不用关心具体的实现,而只需要获取相应的接口完成其服务即可. HelloWorld.java 1     public interface HelloWorld { 2 3         String sayHello(); 4     } 5 然后是具体的实现,HelloWorldImpl.java 1     public class HelloWorldImpl implements

WCF入门教程(三)属性标签

属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的一部分,以及传输对象的定义.如果已经有所了解,请直接PASS. 1.ServiceContract(服务协定) 全名:System.ServiceModel.ServiceContractAttribute 功能:指示接口或类在应用程序中定义服务协定. 简单一句话:标识此接口是否是服务协定,是否需要公开为服务. 详细:使用接口(或类)上的 Se

RabbitMQ入门教程(十一):消息属性Properties

原文:RabbitMQ入门教程(十一):消息属性Properties 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78698364 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 发送消息可以为消息指定一些参数 Delivery mode: 是否持久化,1 - Non-persistent,2 -

PHP反射ReflectionClass、ReflectionMethod 入门教程

PHP反射ReflectionClass.ReflectionMethod 入门教程 http://blog.snsgou.com/post-42.html PHP5 具有完整的反射API,添加对类.接口.函数.方法和扩展进行反向工程的能力. 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括注释.这种动态获取的信息以及动态调用对 象的方法的功能称为反射API.反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复