博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object-C 声明属性为什么用下划线
阅读量:4710 次
发布时间:2019-06-10

本文共 1069 字,大约阅读时间需要 3 分钟。

看到很多源代码里面,使用前面带下划线变量,然后在@synthesize 语句中 在用一个不带下划线的变量名。这样做,到底有什么作用?
百度之后发现,使用下划线的变量just 一个实例变量,比如@synthesize name = _name 我们同样可以用 foo 代替 _name,只是一种的代码的规范和编程风格,那个下划线只是为了方便区别全局变量和本地变量,或者防止变量重名。
 
凡是在头文件里面定义了@property的变量,必定要@synthesize。
 
 
self.nameVarPtr = [[ObjectName alloc] init]

 

nameVarPtr = [[ObjectName alloc] init]

 上面这2种方法我们都见过,那两种赋值方式的区别何在呢?

self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx], 而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。我们申明xxx时,用的属性修饰符retain。当我们,使用self.xxx时,就使用了编译器为我们生成的setXXX方法。在该方法中的retainCount会被加1。

nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。

所以我们要区别好这2种赋值方法:

self调用setter方法的方式ObjectName*  tmp= [[ObjectName alloc] init];self.nameVarPtr =tmp;                 //retainCount=2[tmp release];                               //retainCount=1

 

指针赋值方式,不会调用setter方法nameVarPtr= [[ObjectName alloc] init]; // retainCount=1

对某个变量进行赋值操作的时候,尽量要写self.myObj = xxx; 这才是最可靠的方法。

 

 

转载于:https://www.cnblogs.com/penger/p/4137816.html

你可能感兴趣的文章
【刷题】LOJ 6006 「网络流 24 题」试题库
查看>>
《团队-科学计算器-模块测试过程》
查看>>
virtualenv 的使用简介
查看>>
html文档加载顺序简单理解
查看>>
Swift Perfect 基础项目
查看>>
书单BookList
查看>>
字典(Trie树)
查看>>
查看cpu 温度
查看>>
Unity 中使用预编译指令区分平台
查看>>
论坛项目感想
查看>>
WordPress版微信小程序3.5版发布
查看>>
sicily 1198 Substring
查看>>
Servlet 是否线程安全
查看>>
第二次冲刺(每天更新)
查看>>
Knockout应用开发指南之入门介绍
查看>>
转:国内智能音箱的隐忧:国外拼价格,国内又如何?
查看>>
Odoo Email Template Problem
查看>>
HashMap的源码以及原理
查看>>
Win10任务栏卡死解决方法
查看>>
批量修改文件的编码
查看>>