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

摘要:
ObjectiveC2.0为我们提供了@property和@synthesis。readonly关键字表示不会生成setter,因此它不能与copy/retain/assign组合使用。保留:释放旧对象,将旧对象的值分配给输入对象,然后将输入对象的索引计数增加到1。指定保留将在分配期间唤醒传入值的保留消息。此属性只能用于Objective-C对象类型,而不能用于CoreFoundation对象。package关键字是Mac10.5 Objective Runtime中新添加的,以支持64位系统。

在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的语法:

03_@property

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

attribute主要分为三类:

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

readwrite:生成settergetter方法 (默认)

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.

免责声明:文章转载自《Objective-C入门教程03:属性(@property和@synthesize)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇es常见的字段映射类型之二进制类型(binary)三维建模:方法之CSG与B-Rep比较下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ObjectiveC中一种消息处理方法performSelector: withObject:

摘要: Objective-C中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。首先介绍两个方法。 Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消...

Objective-C调用Swift

如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。 Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴...

objective-c(十二)关于Foundation框架

  Foundation框架可以说是objective-c最强大的库,基本上所有的通用标准都是有Foundation来提供的,首先要介绍的就是NSString对象。   NSString就是java中的String字符串。只不过在oc中。NSString只能赋值的是静态字符串变量,因此赋值是稍微有些不同   NSString temp = @“hello...

MQTT

MQTT简介 mqtt基于订阅者模型架构,客户端如果互相通信,必须在同一订阅主题下,即都订阅了同一个topic,客户端之间是没办法直接通讯的。订阅模型显而易见的好处是群发消息的话只需要发布到topic,所有订阅了这个topic的客户端就可以接收到消息了。 发送消息必须发送到某个topic,重点说明的是不管客户端是否订阅了该topic都可以向topic发送了...

iOS 三种录制视频方式

随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思。它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它们。 这篇文章讨论了关于如何配置视频捕获管线 (pipeline) 和最大限度地利用硬件性能的一些不同选择。 这里有个使用了不同管线的样例 app,可以在Gi...

js(javascript)与ios(Objective-C)相互通信交互

随着苹果SDK的不断升级,越来越多的新特性增加了进来,本文主要讲述从iOS6至今,Native与JavaScript的交互方法 一、UIWebview && iframe && JavaScript  <=iOS6 iOS6原生没有提供js直接调用Objective-C的方式,只能通过UIWebView的UIWebVi...