Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8629435

Browse files
author
zhangyanqiang
committed
Site updated: 2018年09月15日 17:37:20
1 parent 652d7df commit 8629435

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

‎2018/09/15/彻底搞懂属性与成员变量/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
<meta property="og:description" content="本文主要解决如下问题 成员变量、实例变量、属性变量、局部变量、全局变量的概念 @property、@synthesize、@dynamic本质 重写getter和setter方法注意事项 类别(Category)中属性Property 类别(Category)中添加实例变量 Objective-C 中的点语法 self.和下划线的区别 属性、成员变量、self.var、_var使用经验总结 案">
8989
<meta property="og:locale" content="zh-Hans">
9090
<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">
9292
<meta name="twitter:card" content="summary">
9393
<meta name="twitter:title" content="iOS彻底搞清属性与成员变量">
9494
<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)中
405405
<p>在Objective-C提供的runtime函数中,确实有一个class_addIvar()函数用于给类添加成员变量,但是文档中特别说明:</p>
406406
<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>
407407
<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>
409409
<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>
410410
<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 &quot;NSObject+Extension.h&quot;</span><br><span class="line">#import &lt;objc/runtime.h&gt;</span><br><span class="line">static const void *IndieBandNameKey = &amp;IndieBandNameKey; </span><br><span class="line">@implementation NSObject (IndieBandName)</span><br><span class="line">@dynamic indieBandName;</span><br><span class="line">- (NSString *)indieBandName &#123; </span><br><span class="line">return objc_getAssociatedObject(self, IndieBandNameKey);</span><br><span class="line">&#125;</span><br><span class="line">- (void)setIndieBandName:(NSString *)indieBandName &#123; </span><br><span class="line">objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);</span><br><span class="line">&#125;</span><br><span class="line">@end</span><br></pre></td></tr></table></figure>
411411
<p>通过runtime的两种方法就可以为类别添加一个实例变量了。</p>
@@ -615,7 +615,7 @@ <h2 id="属性、成员变量、self-var、-var使用经验总结"><a href="#属
615615

616616

617617

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>
619619

620620

621621
</div>

‎css/main.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1823,7 +1823,7 @@ pre .javascript .function {
18231823
width: 4px;
18241824
height: 4px;
18251825
border-radius: 50%;
1826-
background: #f02aff;
1826+
background: #91ff3c;
18271827
}
18281828
.links-of-blogroll {
18291829
font-size: 13px;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /