学习iOS开发时,会遇到这样那样的问题,那么大家有没有遇到过@synthesizewindow=_window;,在这里面window与_window分别代表什么知道吗?它们的差别在哪,又如何用使用它们,这是学习iOS开发中最常见的问题了。
这里也会涉及到Objective-C中对类、类的属性、类的存取器、类的局部变量的理解:蓝鸥iOS培训推荐:
在32位系统中,如果类的@interface部分没有进行ivar声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:
Synthesizedproperty'xX'musteitherbenamedthesameasacompatibleivarormustexplicitly
nameanivar在64-bit时,运行时系统会自动给类添加ivar,添加的ivar以一个下划线"_"做前缀。
上面声明部分@synthesizewindow=_window;意思是说,window属性为_window实例变量合成访问器方法。
也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。
下面给大家举一个最常见的例子,一看就明白了:
写法一:
写法二:
这个类中声明了一个变量_myObject,又声明了一个属性叫myObject,然后用@synthesize生成了属性myObject的存取方法,这个存取方法的名字应该是:setmyObject和getmyObject。@synthesizemyObject=_myObject的含义就是属性myObject的存取方法是做用于_myObject这个变量的。这种用法在Apple的SampleCode中很常见。
那么,一样是存取操作语句整理
两种赋值方式的区别何在呢?
self.nameVarPtr=xxx这种赋值方式等价于调用[selfsetnameVarPtr:xxx],而setnameVarPtr:xxx的方法的
实现又是依赖于@propert
y的属性的,比如retain,assign等属性。
nameVarPtr=xxx的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的
地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain
,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。
从上面的说法中得出,对成员变量进行赋值,为防内存泄露,就一定要注意以下两点:
1、self调用setter方法的方式
2、指针赋值方式,不会调用setter方法
总结:在给某个变量赋值的时候,要尽量写self.myObj=xxx;因为这种方法最可靠,最实用的方法,在iOS开发中用起来就会很方便了,我是蓝鸥蒋杏飞,有相同爱好的同仁们可以相互讨论下下。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。