Objective-C中的属性机制

        Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域。

    实例变量的作用域如下:

        1. @public : 共有的,该实例变量谁都可以访问;

        2.@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中是private的默认是protected;

        3.@private: 私有的,该实例变量只能在该类的内部访问;

        因为要用protected 或者 private来隐藏类的内部细节,用类或者对象是没法直接访问被隐藏的细节的,所以要用getter和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的getter和setter方法。下面我们要学习一下OC中的属性机制。

        属性的定义和实现

        1.属性的定义

       属性的定义用编译器命令@property来定义,比如要为私有的变量 int a;定义getter和setter方法,@property int a;  用@property会自动的为修饰的变量加上

     getter和setter方法。

        Demo如下: 

@interface Student : NSObject
{
    NSString *name;
    int idNumber;
}
//定义属性
@property NSString *name;
@property int idNumber;

//定义其他方法
@end

        2.属性的实现

        在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。用@synthesize也可以给函数改名用@synthesize name = otherName; 就可以给方法改名。

            demo如下

@implementation Student
 @synthesize name, idNumber;
    //其他方法的实现
@end

    ​    ​3.定义后属性的使用

    ​    ​在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样

    ​

//调用name的setter方法
[student setName : @"ludashi"];
//调用name的getter方法
NSString *name = [student name];

    ​    ​getter和setter方法也可以用点语法来实现

//name的setter方法也可以这样写
student.name  =  @“ludashi”;

//name的getter方法也可以这样写
NSString *name = student.name;

​     ​    上面调用getter和setter方法的方式看着想是直接操作类的属性,其实不然,也是通过方法来操作的。

 

    ​4.property有关的语法

    ​    ​1.自定义存取方法名

    ​    ​    ​系统默认的存方法是setPropertyName, 默认的取方法是propertyName。可以用以下方式来更改setter和getter方法的名字

    ​    ​    ​(1)用getter = getterName来指定getter自定义的名称

    ​    ​    ​    ​    ​demo:  @property (getter = getterName) NSString *name;

 

    ​    ​    ​(2)用setter = setterName来指定setter自定义方法的名称

    ​    ​    ​    ​    ​demo: @property (setter = setterName) NSString *name;

 

    ​    ​2. property的可读写性

    ​    ​    ​property的可读写性决定属性是否有setter方法

    ​    ​    ​(1)readwrite : 指定属性是可读写的,这是默认值,因此可以省略

    ​    ​    ​    ​    ​  @property (readwrite) NSString *name;

    ​    ​    ​  (2) readonly : 指明属性是只读的。系统不会setter方法,但有getter方法

    ​    ​    ​    ​    ​  @property (readonly) NSString *name;

 

    ​   3.用于setter中的语义 :决定了以何种方式对数据成员赋予新值

    strong : 表示强引用关系,即拥有对象的所有权。

    weak : 表示弱引用,不拥有对象的所有权,当目标对象被销毁之后,属性值会被自动设为nil;

    ​    ​    ​assign(赋值): 直接赋值,计数器不会加一,简单的赋值方法,默认赋值方式,适合基本数据类型

    ​    ​    ​copy(拷贝):把原来的对象拷贝过来,计数器会加一,比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02;

    ​    ​    ​retain(保留):这种方式传递的是指针,原有的对象和被赋值的对象的地址是一样的

    ​    ​

    ​   4.原子操作

    ​    ​    ​    ​atomic: 线程安全的;

    ​    ​    ​    ​nonatomic: 线程不安全的;

 

  我们可以简写属性,直接在接口文件中吧{}省略掉,直接用@property来定义方法,省去实现文件中的@synthesize, 访问属性时用_propertyName, 给属性赋值时用self.propertyName

时间: 2024-08-30 13:54:21

Objective-C中的属性机制的相关文章

举例讲解Objective-C中@property属性的用法_IOS

学过c/c++的朋友都知道,我们定义struct/class的时候,如果把访问限定符(public,protected,private)设置为public的话,那么我们是可以直接用.号来访问它内部的数据成员的.比如 //in Test.h class Test { public: int i; float f; }; 我在main函数里面是可以通过下面的方式来使用这个类的:(注意,如果在main函数里面使用此类,除了要包含头文件以外,最重要的是记得把main.m改成main.mm,否则会报一些奇

Java中的反射机制

反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这 是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal pr

自定义实现struts2中的国际化机制

最近一段时间,一直在研究struts2中的国际化实现方案. 对于struts2中标签的国际化中,key值的搜索顺序如下: 假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作: (1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件. (2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载

VC++在对话框中加入属性页

当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个).然后利用Class Wizard来为Tab Control控件创建一个控件变量,该变量是CTabCtrl类的,再为其他控件也创建相应的控件类. 在主对话框的初始函数中CPropert

根据实例详解Java中的反射机制

概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.作用:Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 可以说Java的反射机制是Java中所有框架的基础,要对SSH等框架有一个深刻的理解

云储中基于属性加密的访问控制子系统的研究与实现

云储中基于属性加密的访问控制子系统的研究与实现 电子科技大学 孙有鹏 因为云环境的复杂性,其中的各个实体都不可信,所以,密码访问控制技术成为了防止用户数据泄露最直接的手段.近年来,学术界在访问控制中引入了基于属性的加密体制,一种在基于身份加密的基础上发展而来的方法.本文选取云存储中的访问控制技术作为研究方向,深入分析了基于属性加密的访问控制技术存在的一些问题.包括访问策略表达性的不足.权限撤销的实效性与精细度不足.密钥生成依赖于单一的授权机构等等,现有的属性加密算法都不能完全解决这些问题.本文改

Android中Handler消息传递机制_Android

Handler 是用来干什么的? 1)执行计划任务,可以在预定的时间执行某些任务,可以模拟定时器 2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了.由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面. 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发

浅谈Rails 4 中Strong Parameters机制_ruby专题

要弄明白Rails 4 中Strong Parameters机制,首先我们要看看Rails3中的Parameters 在 Rails3 中创建或更新 Active Record 对象时,会有 Mass Assignment 安全问题.所以 Model 中需要列一个白名单,声明哪些属性可以被 parameter 的数据更新. Rails 3 # kings_controller.rb def create #{ name: 'David', sex:male, age: 31} @king = K

Android中persistent属性用法详解_Android

本文实例讲述了Android中persistent属性用法.分享给大家供大家参考,具体如下: 前段时间在研究telephony时,一直没有在framework下发现对telephony的初始化(PhoneFactory.Java中的makeDefaultPhones函数)的调用.结果全局搜索之后发现在application PhoneApp(packages/apps/Phone)中调用了.但是application PhoneApp既没有被Broadcast唤醒,也没有被其他service调用