`
synchronized_lala
  • 浏览: 40581 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

property和_property的一些小结

阅读更多

 

在.h文件中:

@interface MyClass:NSObject

{

      MyObjecct *_myObject;

}

@property(nonamtic, retain) MyObjecct *myObject;

@end

 

在.m文件中

@implementation MyClass

 

@synthesize myObject=_myObject;

 

 

- (void)dealloc

{

    [_myObject release];

    [super dealloc];

}

 

@end


通过最近google了一些文章,如果大家观后有自己看法希望能留言
_myObject是实例变量,相当于C++中self->myObject
self.myObject相当于[self myObject];是一个消息,也有说是属性
http://stackoverflow.com/questions/5466496/why-rename-synthesized-properties-in-ios-with-leading-underscores

myObject和_myObject是用来区别实例变量消息。一般来说,应该使用setter和getter的属性,而不是直接访问实例变量。
当你写一个setter方法,该方法不能自身使用setter,否则你会产生无限递归,并且发生崩溃。setter调用自身,再次调用自身,直到堆栈溢出。
http://www.iphonedevsdk.com/forum/iphone-sdk-development/98273-feeling-confused-about-_property-and-property.html

写成这样:
@interface MyClass
@property (nonatomic, retain) NSString* myProperty;
- (NSString*)someOtherMethod;
@end

@implementation MyClass
@synthesize myProperty = _myProperty; // setter and ivar are created automatically

- (NSString*)myProperty {
    return [_myProperty stringByAppendingString:@" Tricky."];
}

- (NSString*)someOtherMethod {
    return [self myProperty];
}
http://stackoverflow.com/questions/9541828/property-and-setters-and-getters

http://stackoverflow.com/questions/4172810/what-is-the-difference-between-ivars-and-properties-in-objective-c



分享到:
评论
7 楼 synchronized_lala 2012-09-11  
白色蜻蜓 写道
synchronized_lala 写道
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。

不错,大体理解上没有任何问题,对此做出以下几点补充
1、你可以用[self.student retainCount]打印出引用基数可以看到该基数的确切数值,当然,很熟练就没有必要了。
2、针对你的第二条,这个不加self的sutdent应该是你定义了变量,但是没有对其添加@property 和@synthesize吧。总之,你alloc了一下,又release了一下,基数归0,就不能再引用了,如非要这样可以[student retain]一下 即可调用
3、对于你说的第三条我们一般都这样操作self.student =[ [[Student alloc] init] autoreleae]; 这样autorelease一下,就不会泄漏了。
4、总之,有alloc、copy、retain的地方你就肯定要用一个release或者autorelease与相对应,这就是oc内存管理的黄金法则,当然了,切实的体会还需在代码中多多练习。

--希望对你有帮助,有疑惑得地方再行讨论。









嗯嗯,retainCount我试了一下,挺好用的,还有你之前说的_object = nil;我也改过来了,非常感谢啊!(*^__^*) 嘻嘻……
6 楼 白色蜻蜓 2012-09-10  
synchronized_lala 写道
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。

不错,大体理解上没有任何问题,对此做出以下几点补充
1、你可以用[self.student retainCount]打印出引用基数可以看到该基数的确切数值,当然,很熟练就没有必要了。
2、针对你的第二条,这个不加self的sutdent应该是你定义了变量,但是没有对其添加@property 和@synthesize吧。总之,你alloc了一下,又release了一下,基数归0,就不能再引用了,如非要这样可以[student retain]一下 即可调用
3、对于你说的第三条我们一般都这样操作self.student =[ [[Student alloc] init] autoreleae]; 这样autorelease一下,就不会泄漏了。
4、总之,有alloc、copy、retain的地方你就肯定要用一个release或者autorelease与相对应,这就是oc内存管理的黄金法则,当然了,切实的体会还需在代码中多多练习。

--希望对你有帮助,有疑惑得地方再行讨论。
5 楼 synchronized_lala 2012-09-09  
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。
4 楼 synchronized_lala 2012-09-08  
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助





嗯嗯,有帮助,因为oc的知识点没有系统学过,所以对你一开始的话不是很理解,现在看了一点,总算是有进步啊。还有虽然对在dealloc中加_myObject =nil来直接将其引用基数归0,我理解了,但是还没有代码上的体会。我要继续努力。O(∩_∩)O谢谢!
3 楼 白色蜻蜓 2012-09-07  
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助
2 楼 synchronized_lala 2012-09-05  
白色蜻蜓 写道
建议在dealloc中  [_myObject release]之后加一个  _myObject =nil 效果更好

谢谢,不过就是我其实不太懂,因为我google的时候有的人说加self.myObject比较好,有的说不用,加了反倒有问题(是英文写得,且没有其他语言的例子,我不能很好的迁移,不是很理解),你这边又说加_myObject比较好。能不能给我具体说说原因呀
1 楼 白色蜻蜓 2012-09-05  
建议在dealloc中  [_myObject release]之后加一个  _myObject =nil 效果更好

相关推荐

    java的property配置文件的用法.txt

    #### 六、小结 通过本文的学习,您应该已经掌握了如何在Java中使用`.properties`文件来管理配置信息。这对于构建可扩展和易于维护的应用程序是非常重要的。无论是数据库连接字符串、API密钥还是其他的环境变量,都...

    hibernate 学习笔记小结

    ### Hibernate学习笔记小结 #### 一、简介与配置 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它允许开发人员将Java对象自动持久化到数据库表中,从而简化了数据访问层的开发工作。在Spring框架中,...

    spring学习小结

    【Spring 框架学习小结】 Spring 是一个流行的 Java 应用开发框架,它以其控制反转(Inversion of Control, IOC)和面向切面编程(Aspect-Oriented Programming, AOP)为核心特性,被誉为轻量级框架。下面将详细...

    JavaScript中各种引用类型的常用操作方法小结_.docx

    例如,可以使用`obj.property`来获取或设置对象的属性,`delete obj.property`来删除属性,以及`for...in`循环遍历对象的属性。 **Array类型** Array类型提供了丰富的操作方法,如排序、截取、添加和删除元素等。在...

    hibernate小结

    ### Hibernate小结 #### 一、概述 在本篇文章中,我们将对Hibernate框架进行一个较为全面的小结。主要内容包括:Hibernate映射中的Lazy加载策略、Hibernate查询语言(HQL)的使用方法,以及一些基本配置与操作技巧...

    WPF控件样式小结

    "WPF控件样式小结"这个主题涵盖了如何利用这些特性来定制控件的外观和行为。让我们深入探讨一下WPF中的样式(Style)和控制模板(ControlTemplate)。 **样式(Style)** 样式在WPF中用于定义控件的一系列属性值,...

    Struts2+Hibernate+Spring项目小结――Hibernate部分

    在构建企业级应用时,常常会采用Struts2、Hibernate和Spring这三种技术进行整合,形成SSH框架。这里我们主要讨论SSH项目中的Hibernate部分,它是一个强大的对象关系映射(ORM)框架,使得开发者可以方便地将数据库...

    matlab二维曲线绘制小结

    Matlab 二维曲线绘制小结 Matlab 是一种功能强大的编程语言,广泛应用于科学计算、数据分析和可视化领域。绘制二维曲线是 Matlab 中最基本也是最常用的功能之一。本文将详细介绍 Matlab 中绘制二维曲线的方法和技巧...

    ibatis 学习小结笔记

    ### ibatis 学习小结笔记 #### 一、ibatis 概述 ibatis 是一个基于 Java 的持久层框架,它提供了一种简便的方式来处理关系型数据库与 Java 对象之间的映射(O/R Mapping)。ibatis 在设计上强调的是 SQL 语句的...

    python学习笔记-面向对象高级编程-20200324

    文章目录面向对象高级编程使用__slots__使用__slots__使用@property练习多重继承Mixln小结定制类__str____iter____getitem____getattr____call__小结使用枚举类exercise小结使用元类type()metaclass 面向对象高级...

    Tween动画小结

    在Android 3.0(API Level 11)及更高版本中,引入了Property Animation系统,包括`ObjectAnimator`和`ValueAnimator`,它们提供了更强大的动画控制能力。尽管如此,Tween动画仍然在许多场景下被广泛使用,特别是...

    Properties类小结

    2. `getProperty(String key)` 和 `setProperty(String key, String value)`:获取和设置特定键的值。当需要根据键查找对应的值时,这两个方法非常有用。 3. `loadFromXML(InputStream)` 和 `storeToXML...

    VB.NET入门小结

    - `Property Let` 和 `Property Set` 不再使用,现在使用 `Property` 关键字。 - `Currency` 数据类型不再支持,取而代之的是 `Decimal`。 - `Variant` 类型被 `Object` 替代,`Object` 兼具VB6的 `Object` 和 `...

    css3.0新知识小结

    以下是对CSS3中一些关键知识点的详细解释: 1. **CSS3 Transform**: - `transform`属性允许你对元素进行二维或三维的转换,如移动、旋转、缩放和倾斜。例如,`transform: translate(100px) rotate(40deg) scale(2...

    Nhibernate常见的三种配置方法

    #### 小结 以上三种配置方式各有优缺点,可以根据具体项目的实际需求选择最适合的方式。通过将配置文件和日志框架(如log4net)结合使用,可以进一步提升系统的可维护性和扩展性。希望这些配置示例能够帮助到正在...

    javascript继承的六大模式小结

    JavaScript中的继承机制是其面向对象编程的核心特性,它允许创建基于现有对象的新对象,从而实现代码的重用和扩展。本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式...

    Yarn 配置相关的文档

    5. 小结 本文档主要介绍了 Yarn 配置相关的知识点,包括 HDFS Federation 和架构的配置。我们可以通过配置 hdfs-site.xml 文件来定义 Namenode 和 Datanode 的配置,并且可以通过使用 pssh 和 pscp 工具来便捷地...

    Spring3.2小结

    Spring 3.2 是一个重要的版本,它在Spring框架的基础上提供了更多增强的功能和优化,尤其在依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)方面。Spring是一个开源的Java框架,它旨在...

    FreeMarker学习代码小结

    5. 引用对象属性:通过`.`操作符访问对象的属性,如`${bean.property}`。 四、实际应用 1. 视图渲染:在Web开发中,FreeMarker结合Servlet容器,根据后台传入的数据模型渲染出HTML页面。 2. 邮件模板:用于生成...

Global site tag (gtag.js) - Google Analytics