与使用Property过程创建类属性 有什么区别

与使用Property过程创建类属性 有什么区别_百度知道
与使用Property过程创建类属性 有什么区别
我有更好的答案
且它的声明时的类型将限制你的赋值Property创建的类属性,它具有代码实体,在代码里面可以对具体的保存属性值的字段的赋值过程起监督作用,当然也可以将赋的值规范化,你只能对它进行赋值。Public创建的字段确切说,使用Public创建的是类字段,用Property创建的才是类属性,这是专业软件开发中的术语
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。iOS开发中@property的属性weak nonatomic strong readonly等介绍 - 吕滔博客
比别人多一点执着,你就会创造奇迹
3 xcode 中的新标记&strong weakstrong 用来修饰强引用的属性;对应以前retain&weak 用来修饰弱引用的属性;对应以前的assign
栏目分类:49个
发布文章:1331篇
用户评论:712条
开博至今:4032天
匹配中括号中的单个字符,如a或b或c
匹配除了a、b、c等字符的其他单个字符
匹配一个字符范围,如a到z
匹配一个字符范围,如a-z 或 A-Z
匹配行的开始
匹配行的结束
匹配一个字符串的开始
匹配一个字符串的结束
匹配任意单个字符
匹配空白字符,如空格,TAB
匹配非空白字符
匹配一个数字
匹配非数字
匹配一个字母
匹配非字母
匹配字符边界
引用所有括号中的内容
零个或1个a
零个或多个a
1个或多个a
3次重复的a
3次或3次以上重复的a
3到6次重复的a
查找所有可能的匹配
不区分大小写
忽略空白模式
可执行模式,PHP专有
强制从目标字符串开头匹配
使用$限制结尾字符,则不允许结尾有换行
只匹配最近的一个字符串;不重复匹配
: pid是传入当前获取的id值.在后台查询当前这个id值下的下级分类.
: Uncaught ReferenceError: form is...
: 8年的老博主了、致敬
: hello world
: 好的,感谢您的反馈。翻译完了也没有校验。。。
检查了一下,med...
: 不知道你还记不记得之前你翻译的medoo文档:http://me...
: 不错不错。
: 回头我写个php的demo.
: 请问有没有具体pid使用的方法呢?
: 恩,如果是在局域网内部进行系统迁移,我们对比过 SSH 的压缩和...
: 文中的方案还是比较局限,个人认为还是适合主机迁移的时候比较好使。...
: 使用 axel 或者 aria2 开启多线程下载,同样能达到相同...
: 竟然还有这种操作
: 以前还有站点统计或百度统计撒的,这两产品到了今年已经开始不争气啦...
: 原来 Nginx 还有可以这样分析统计。
: 能个实例吗?
: 哈哈哈。。。话说也没毛病。以下试题来自:
单项选择题 C#中TestClass为一自定义类,其中有以下属性定义 publicvoidProperty{&} 使用以下语句创建了该类的对象,并使变量obj引用该对象: TestClassobj=newTestClass(); 那么,可通过什么方式访问类TestClass的Property属性?()
A.Obj,Property;
B.MyClass.Property;
C.obj::Property;
D.obj.Property();
为您推荐的考试题库
您可能感兴趣的试卷
你可能感兴趣的试题
D.无特殊要求
A.Connection
C.DataReader
D.Delegate
C.internal
D.protected在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
最近看了很多别人写的example,一直搞不懂为什么很多人同时写属性和成员变量
@interface KKProgressToolbar : UIToolbar {
id &KKProgressToolbarDelegate& __weak _actionD
UIBarButtonItem* _stopButtonI
UIActivityIndicatorView* _activityI
UILabel* _statusL
UIProgressView* _progressB
@property (nonatomic, strong) UIBarButtonItem *stopButtonI
@property (nonatomic, strong) UIActivityIndicatorView *activityI
@property (nonatomic, strong) UILabel *statusL
@property (nonatomic, strong) UIProgressView *progressB
@property (nonatomic, weak) id &KKProgressToolbarDelegate& actionD
一般我自己写的时候,直接写@property, 然后在m文件中,写上
@synthesize aaaaa = _
我刚开始学IOS,不知道这个的区别是什么,望有人不嫌弃,指点一二,在此谢过!!!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
成员变量主要是适用于iOS5之前的开发,需要程序员手动进行内存管理。iOS5之后(包括iOS5)引入了ARC(Automatic Reference Counting)同过在property中使用strong,weak等标记自动对内存进行管理。也就是说进行iOS5及以后系统版本的开发,可以放心的使用property,而无需对其进行手动的内存管理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
声明了@property并@synthesize后编译器会为你的实例变量生成getter和setter,这些方法会遵循你声明的内存管理的语义,在set的时候执行对应的操作,比如retain,copy等;但它们是方法,而不是变量,所以obj.foo = @&a&其实是一个语法糖,等同于[obj setFoo:@&a&]。在过去你还需要声明对应的实例变量,并通过@synthesize foo = _foo的方式建立和它们之间的关系,但新的Clang编译器会默认帮你加入@synthesize的步骤,默认实例变量形式为property名加下划线。但是你依然可以声明实例变量,并手动建立和property的关系,尤其是实例变量的形式与默认的不同,比如:@synthesize foo = _bar。一般的情况下你应该多用@property,因为它可以进行某种程度的自动内存管理(根据你声明时的语意义),但是由于getter和setter本质上是普通的方法,所以它们可以被覆盖,可以执行除了get和set额外的操作(副作用),所以在某些情况下(比如init...和dealloc方法里)你会手动去进行赋值。同理,由于@property声明的是方法,你可以不必有对应的实例变量,而是自行实现一个getter和setter执行自定义的操作。有时候你甚至不用去声明对应的实例变量和getter/setter,因为它们在父类已经存在,或者在运行时才存在,那么这时候你会用到@dynamic而不是@synthesize,不然编译器会报错。关于使用实例变量还是@property,其实和用不用ARC没有太多关系。。。,它们也不是互相替代的关系
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这类问题,建议去看最新版的Programming iOS6等书籍,不要再过多纠结以前的代码了(比如ARC以前,LLVM编译器不自动生成成员变量定义的时代)。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
本质上来讲,属性也会帮你定义一个成员变量,并根据属性的声明自动生成getter/setter 方法,其中setter 方法根据属性(property)的属性(attribute)来提供不同的内存管理策略。
简单翻译一个SO的答案:,展开说一下成员变量的好处。
如果成员变量是private,程序中的其它对象很难直接访问该成员变量。如果是属性,相对更容易用父类方法读写属性。
成员变量地址可以根据实例的内存地址偏移寻址。而属性的读写都需要函数调用,相对更慢。
非基础类型
对于复杂的C++类型,往往设为成员变量更合适,也许这种类型不支持copy,或者完全复制很麻烦。
多线程环境下,为保证数据一致性,在需要同步执行的代码段更应该使用成员变量。如果对需要同步更新的数据用getter/setter 方法,数据更新效率低,会带来更多的获取锁请求失败。
程序正确性
成员变量可以做直观的内存管理。属性可以一层层继承,还可以复写。容易出错。
二进制文件的体积
默认用属性,会生成不必要的getter/setter 方法,程序体积会变大。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
@property 的本质是什么?@property = ivar + getter +下面解释下:“属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)。“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0的一部分。 而在正规的 Objective-C 编码风格中,存取方法有着严格的命名规范。 正因为有了这种严格的命名规范,所以 Objective-C 这门语言才能根据名称自动创建出存取方法。其实也可以把属性当做一种关键字,其表示:编译器会自动写出一套存取方法,用以访问给定类型中具有给定名称的变量。 所以你也可以这么说:@property = getter +例如下面这个类:
Person : NSObject @property NSString *firstN @property NSString *lastN @end上述代码写出来的类与下面这种写法等效:
Person : NSObject - (NSString *)firstN - (void)setFirstName:(NSString *)firstN - (NSString *)lastN - (void)setLastName:(NSString *)lastN @endivar、getter、setter 是如何生成并添加到这个类中的?“自动合成”( autosynthesis)完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”( autosynthesis)。需要强调的是,这个过程由编译器在编译期执行,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。在前例中,会生成两个实例变量,其名称分别为 _firstName与_lastName。也可以在类的实现代码里通过 @synthesize语法来指定实例变量的名字.
@implementation Person @synthesize firstName = _myFirstN @synthesize lastName = myLastN @end我为了搞清属性是怎么实现的,曾经反编译过相关的代码,大致生成了五个东西:1)OBJC_IVAR_$类名$属性名称 :该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表示该变量距离存放对象的内存区域的起始地址有多远。2)setter与getter方法对应的实现函数3)ivar_list :成员变量列表4)method_list :方法列表5)prop_list :属性列表也就是说我们每次在增加一个属性,系统都会在ivar_list中添加一个成员变量的描述,在method_list中增加setter与getter方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出setter与getter方法对应的实现,在setter方法中从偏移量的位置开始赋值,在getter方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。查看: 911|回复: 0
VB6中类的属性过程
运用属性过程
Visual Basic 提供下表所列的三种属性过程。
过程目的Property Get返回属性的值Property Let设置属性的值Property Set设置对象属性的值(即,该属性含有对象引用)。
从上表可见,每一个属性过程都有自己特殊的功能。典型的属性由一对属性过程组成:Property Get 检索属性的值,Property Let 或 Property Set给属性赋值。
这些作用在有些情况下可能重叠。有两类赋值的属性过程的原因,是因为将对象引用赋给对象变量时,Visual Basic 有特殊的语法:
Dim wdg As Widget
Set wdg = New Widget规则很简单:如果有 Set 语句,则 Visual Basic 调用 Property Set,如果没有则调用 Property Let。
提示& &返回到经典的 Basics 语法,为了正确使用 Property Let 和 Property Set 保持清洁整齐,应键入 Let x = 4(直到今天 Visual Basic 还支持的语法)而不是 x = 4,。Visual Basic总是根据赋值类型决定调用属性过程— 对于 Let x = 4 调用 Property Let,对于 Set c1 = New Class1(对象属性)则调用 Property Set。
详细信息& &“编程基础”中“对象使用”解释 Set 语句对对象变量的使用。
读写属性下列编码显示了典型的读写属性:
'属性值的私有存储区。
Private mintNumberOfTeeth As IntegerPublic
Property Get NumberOfTeeth() As Integer& &
NumberOfTeeth = mintNumberOfTeeth
End Property
Public Property Let NumberOfTeeth(ByVal NewValue _& &As Integer)& &'(省略验证属性值代码。)& &
mintNumberOfTeeth = NewValue
End Property存储了属性值的私有变量名,由作用域前缀 (m),类型前缀 (int) 和名称 (NumberOfTeeth) 组成,其中,作用域前缀 (m) 指明变量是模块级的。使用属性相同的名称可指明该变量和属性是相关的。
毫无疑问,已经注意到,这里和以前的示例一样,含有读写属性的属性过程名必须是相同的。
注意& &属性过程缺省为公共的,因此,如果省略Public 关键词,则属性过程仍是公共的。如果想要使属性为私有(只有对象内部才可访问),必须用 Private关键词声明。即使不是必须,最好还是使用 Public 关键词,因为这可使意图清楚。
运行和播放属性过程单步运行一些属性过程代码是有益处的。使用“工程”菜单,打开一个新的 Standard Exe 工程,并增添一个类模块。如上所示,从 NumberOfTeeth 属性复制代码到 Class1。
切换到 Form1,将下列代码添加到 Load 事件中:
Private Sub Form_Load()& &Dim c1 As Class1& &Set c1 = New Class1& &'赋给新的属性值。& &c1.NumberOfTeeth = 42& &'显示属性值。& &MsgBox c1.NumberOfTeethEnd Sub按 F8 键,单步运行代码。注意,当属性被赋值时,运行跳到 Property Let,当检索属性值时,运行跳到 Property Get。将会发现,对属性过程其它组合,重复做这种练习是很有用的。
属性过程对的参数必须匹配至今所见的属性过程示例都很简单,对多数属性而言属性过程也将是这样。但是,属性过程可有多个参数— 甚至可选参数。多个参数中最有用的是数组,下面将讨论。
当使用多个参数时,属性过程对的参数必须匹配。下表给出了在属性过程声明中参数的要求。
过程声明语法Property GetProperty Get propertyname(1,..., n) As typeProperty LetProperty Letpropertyname(1,..., n, n+1)Property SetProperty Setpropertyname(1,..., n, n+1)
在 Property 过程中,从第一个参数到倒数第二个参数 (1,..., n),必须具有与过程相同的名称和数据类型。就象其它过程类型一样,列表中必需参数应排在第一个可选参数之前。
可能注意到,Property Get 过程的声明比相关的 Property Let 或 Property Set少一个参数。Property Get 过程的数据类型的声明必须与 Property Let 或 Property Set 最后一个参数 (n+1) 的数据类型一样。
例如,一个类似二维数组的属性的 Property Let 声明:
Public Property Let Things(ByVal X As Integer, _ByVal Y As Integer, ByVal Thing As Variant)& &'(省略给数组元素赋值的代码。)End PropertyProperty Get 的参数声明必须与 Property Let 过程的参数名称和数据类型相同:
Public Property Get Things(ByVal X As Integer, _ByVal Y As Integer) As Variant& &'(省略从数组取值的代码。)End Property在 Property Set 声明中的最后参数的数据类型,要么是对象类型,要么是Variant 类型。
参数匹配图 9.8 给出了这些参数匹配规则的理由。并显示了 Visual Basic 如何将赋值语句部分与 Property Let 参数相匹配。
图 9.8& &Property Let 过程的调用
带多参数的属性过程最常用于创建属性数组。
只读属性要创建只读属性,只须简单地省略 Property Let 或(对于对象属性)Property Set。
对象属性若要创建一个读写对象属性,应使用 Property Get 和 Property Set 如:
Private mwdgWidget As WidgetPublic Property Get Widget() As Widget& &'Set 语句被用来返回一个对象引用。& &Set Widget = mwdgWidgetEnd PropertyPublic Property Set Widget(ByVal NewWidget As Widget)& &Set mwdgWidget = NewWidgetEnd Property Variants 属性 Variants 数据类型的读写属性是最复杂的。如下所示,使用三种属性过程类型:
Private mvntAnything As VariantPublic Property Get Anything() As Variant& &'Set 语句只用于包含了对象引用的任何属性。& &If IsObject(mvntAnything) Then& && &Set Anything = mvntAnything& &Else& && &Anything = mvntAnything& &End IfEnd PropertyPublic Property Let Anything(ByVal NewValue As Variant)& &'(省略验证代码。)& &mvntAnything = NewWidgetEnd PropertyPublic Property Set Anything(ByVal NewValue As Variant)& &'(省略验证代码。)& &Set mvntAnything = NewWidgetEnd Property在正确环境中,Property Set 和 Property Let 总是很正常的使用。但是,使用 Property Get 必须考虑以下二种情况:
strSomeString = objvar1.AnythingSet objvar2 = objvar1.Anything在第一种情况中,Anything 属性包含了字符串,它赋给了 String 变量。在第二个情况中,Anything 属性包含了对象引用,它被赋给对象变量。
通过使用 IsObject 函数,在返回值之前测试私有 Variants 变量,可对 Property Get 进行编程来处理这两种情况。
自然,当属性包含对象引用时,如果第一条编码被调用,将会出现错误,但这不是 Property Get 问题,而是使用 Variants 属性的问题。
仅写一次属性属性过程有几种可能的组合。所有的组合都是有效的,但有些相对来说不太常用,比如只写属性(只有 Property Let,而无 Property Get)。有些则取决于另外的因素,而不是所组合的属性过程类型。
例如,如本章后“对象模型”所描述的那样,当通过创建一个对象模型在程序中组织对象时,可能想让该对象能引用包含它的对象。使用 Parent 属性可这样做。
当对象创建时,应设置 Parent 属性,但此后,可能想防止其被有意或无意地改变。以下示例显示了 Account 对象如何使用 Parent 属性。该属性指向含有帐号的 Department 对象。
'Parent 属性要用私有数据存储Private mdeptParent As DepartmentProperty Get Parent() As Department& &'使用 Set 语句引用对象。
& &Set Parent = mdeptParentEnd Property'属性值只能被设置一次。
Public Property Set Parent(ByVal NewParent _As Department)& &
If deptParent Is Nothing Then& && &'赋初值。
& && &Set mdeptParent = NewParent& &
Else& && &
Err.Raise Number:=vbObjectError + 32144,
Description:=&Parent property is read-only&
End Property当访问 Account 对象的父对象时,例如通过代码 strX = acctNew.Parent.Name 获取部门名称,Property Get 被用于返回对父对象的引用。
该示例中,编入 Property Set 是为了使 Parent 属性只能被设置一次。例如,当 Department 对象创建一个新的帐号时,可以执行代码 Set acctNew.Parent = Me 设置属性。此后,该属性为只读的。
详细信息& &因为在 Visual Basic 中窗体是类,故可向窗体添加用户属性。请参阅本章前面“定制窗体类”的内容。
Powered by}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信