|
88 | 88 | <meta property="og:description" content="本文主要解决如下问题 成员变量、实例变量、属性变量、局部变量、全局变量的概念 @property、@synthesize、@dynamic本质 重写getter和setter方法注意事项 类别(Category)中属性Property 类别(Category)中添加实例变量 Objective-C 中的点语法 self.和下划线的区别 属性、成员变量、self.var、_var使用经验总结 案">
|
89 | 89 | <meta property="og:locale" content="zh-Hans">
|
90 | 90 | <meta property="og:image" content="https://github.com/Richard-zhang-iOS/Richard-zhang-iOS.github.io/blob/master/res/category-property.png?raw=true">
|
91 | | -<meta property="og:updated_time" content="2018年09月15日T09:35:38.177Z"> |
| 91 | +<meta property="og:updated_time" content="2018年09月15日T09:37:06.708Z"> |
92 | 92 | <meta name="twitter:card" content="summary">
|
93 | 93 | <meta name="twitter:title" content="iOS彻底搞清属性与成员变量">
|
94 | 94 | <meta name="twitter:description" content="本文主要解决如下问题 成员变量、实例变量、属性变量、局部变量、全局变量的概念 @property、@synthesize、@dynamic本质 重写getter和setter方法注意事项 类别(Category)中属性Property 类别(Category)中添加实例变量 Objective-C 中的点语法 self.和下划线的区别 属性、成员变量、self.var、_var使用经验总结 案">
|
@@ -405,7 +405,7 @@ <h2 id="类别(Category)中属性Property"><a href="#类别(Category)中
|
405 | 405 | <p>在Objective-C提供的runtime函数中,确实有一个class_addIvar()函数用于给类添加成员变量,但是文档中特别说明:</p>
|
406 | 406 | <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">This function may only be called after objc_allocateClassPair and before objc_registerClassPair. Adding an instance variable to an existing class is not supported.</span><br></pre></td></tr></table></figure>
|
407 | 407 | <p>意思是说,这个函数只能在"构建一个类的过程中"调用。一旦完成类定义,就不能再添加成员变量了。经过编译的类在程序启动后就<code>runtime</code>加载,没有机会调用<code>addIvar</code>。程序在运行时动态构建的类需要在调用 objc_allocateClassPair 之后,objc_registerClassPair之前才可以被使用,同样没有机会再添加成员变量。那为什么可以在类别中添加方法和属性呢?<br>因为方法和属性并不"属于"类实例,而成员变量"属于"类实例。我们所说的"类实例"概念,指的是一块内存区域,包含了isa指针和所有的成员变量。所以假如允许动态修改类成员变量布局,已经创建出的类实例就不符合类定义了,变成了无效对象。但方法定义是在objc_class中管理的,不管如何增删类方法,都不影响类实例的内存布局,已经创建出的类实例仍然可正常使用。</p>
|
408 | | -<h5 id="在类别中添加实例变量"><a href="#在类别中添加实例变量" class="headerlink" title="在类别中添加实例变量"></a>在类别中添加实例变量</h5><p>那我偏偏想要在类别中添加实例变量该怎么办呢?这时候就要用到runtime了,不要忘记了Objective-C是动态语言。一种常见的办法是通过runtime.h中<code>objc_getAssociatedObject / objc_setAssociatedObject</code>来访问和生成关联对象。这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。</p> |
| 408 | +<h2 id="在类别中添加实例变量"><a href="#在类别中添加实例变量" class="headerlink" title="在类别中添加实例变量"></a>在类别中添加实例变量</h2><p>那我偏偏想要在类别中添加实例变量该怎么办呢?这时候就要用到runtime了,不要忘记了Objective-C是动态语言。一种常见的办法是通过runtime.h中<code>objc_getAssociatedObject / objc_setAssociatedObject</code>来访问和生成关联对象。这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。</p> |
409 | 409 | <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">//.h文件代码</span><br><span class="line">//NSObject+IndieBandName.h</span><br><span class="line">@interface NSObject (IndieBandName)</span><br><span class="line">@property (nonatomic, strong) NSString *indieBandName;</span><br><span class="line">@end</span><br></pre></td></tr></table></figure>
|
410 | 410 | <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">.m文件中代码</span><br><span class="line">// NSObject+IndieBandName.m </span><br><span class="line">#import "NSObject+Extension.h"</span><br><span class="line">#import <objc/runtime.h></span><br><span class="line">static const void *IndieBandNameKey = &IndieBandNameKey; </span><br><span class="line">@implementation NSObject (IndieBandName)</span><br><span class="line">@dynamic indieBandName;</span><br><span class="line">- (NSString *)indieBandName { </span><br><span class="line">return objc_getAssociatedObject(self, IndieBandNameKey);</span><br><span class="line">}</span><br><span class="line">- (void)setIndieBandName:(NSString *)indieBandName { </span><br><span class="line">objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);</span><br><span class="line">}</span><br><span class="line">@end</span><br></pre></td></tr></table></figure>
|
411 | 411 | <p>通过runtime的两种方法就可以为类别添加一个实例变量了。</p>
|
@@ -615,7 +615,7 @@ <h2 id="属性、成员变量、self-var、-var使用经验总结"><a href="#属
|
615 | 615 |
|
616 | 616 |
|
617 | 617 |
|
618 | | - <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#案例讲解"><span class="nav-number">1.</span> <span class="nav-text">案例讲解</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#成员变量"><span class="nav-number">1.1.</span> <span class="nav-text">成员变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#实例变量"><span class="nav-number">1.2.</span> <span class="nav-text">实例变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#属性变量"><span class="nav-number">1.3.</span> <span class="nav-text">属性变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#局部变量:"><span class="nav-number">1.4.</span> <span class="nav-text">局部变量:</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#全局变量:"><span class="nav-number">1.5.</span> <span class="nav-text">全局变量:</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#property、-synthesize、-dynamic本质"><span class="nav-number">2.</span> <span class="nav-text">@property、@synthesize、@dynamic本质</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#property原理"><span class="nav-number">2.1.</span> <span class="nav-text">@property原理</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#synthesize"><span class="nav-number">2.2.</span> <span class="nav-text">@synthesize</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#dynamic"><span class="nav-number">2.3.</span> <span class="nav-text">@dynamic</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#重写getter和setter方法注意事项"><span class="nav-number">3.</span> <span class="nav-text">重写getter和setter方法注意事项</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#类别(Category)中属性Property"><span class="nav-number">4.</span> <span class="nav-text">类别(Category)中属性Property</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#在类别中添加实例变量"><span class="nav-number">4.0.0.1.</span> <span class="nav-text">在类别中添加实例变量</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Objective-C-中的点语法"><span class="nav-number">5.</span> <span class="nav-text">Objective-C 中的点语法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#self-var和-var的区别"><span class="nav-number">6.</span> <span class="nav-text">self.var和_var的区别</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#属性、成员变量、self-var、-var使用经验总结"><span class="nav-number">7.</span> <span class="nav-text">属性、成员变量、self.var、_var使用经验总结</span></a></li></ol></div> |
| 618 | + <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#案例讲解"><span class="nav-number">1.</span> <span class="nav-text">案例讲解</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#成员变量"><span class="nav-number">1.1.</span> <span class="nav-text">成员变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#实例变量"><span class="nav-number">1.2.</span> <span class="nav-text">实例变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#属性变量"><span class="nav-number">1.3.</span> <span class="nav-text">属性变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#局部变量:"><span class="nav-number">1.4.</span> <span class="nav-text">局部变量:</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#全局变量:"><span class="nav-number">1.5.</span> <span class="nav-text">全局变量:</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#property、-synthesize、-dynamic本质"><span class="nav-number">2.</span> <span class="nav-text">@property、@synthesize、@dynamic本质</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#property原理"><span class="nav-number">2.1.</span> <span class="nav-text">@property原理</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#synthesize"><span class="nav-number">2.2.</span> <span class="nav-text">@synthesize</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#dynamic"><span class="nav-number">2.3.</span> <span class="nav-text">@dynamic</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#重写getter和setter方法注意事项"><span class="nav-number">3.</span> <span class="nav-text">重写getter和setter方法注意事项</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#类别(Category)中属性Property"><span class="nav-number">4.</span> <span class="nav-text">类别(Category)中属性Property</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#在类别中添加实例变量"><span class="nav-number">5.</span> <span class="nav-text">在类别中添加实例变量</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Objective-C-中的点语法"><span class="nav-number">6.</span> <span class="nav-text">Objective-C 中的点语法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#self-var和-var的区别"><span class="nav-number">7.</span> <span class="nav-text">self.var和_var的区别</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#属性、成员变量、self-var、-var使用经验总结"><span class="nav-number">8.</span> <span class="nav-text">属性、成员变量、self.var、_var使用经验总结</span></a></li></ol></div> |
619 | 619 |
|
620 | 620 |
|
621 | 621 | </div>
|
|
0 commit comments