菜鸟教程小白 发表于 2022-12-12 13:21:28

ios - 初始化 NIB 加载控件 - EXC_BAD_ACCESS 销毁


                                            <p><p>我正在从我的 Storyboard/iOS6/ARC 应用程序中的 xib 加载覆盖 View 。这个 View 有一个 ImageView 、 TextView 和一些开关。我的问题是,在自定义了一些控件之后,当我试图从 View 转换回我的主视图时,我得到了 EXC_BAD_ACCESS。 </p>

<p>我通过从我的 ViewController 创建一个实例(在 <code>button_touchup</code> 函数期间)并调用 UIView <code>transitionWithView</code> 来加载 View 。我可以使用从 VC 通过填充这些控件的实例函数传递的数据来初始化 <code>imageView</code> 和 <code>text</code>。这很好用,我可以毫无问题地过渡。</p>

<p>当我尝试自定义开关颜色时出现问题 - 例如<code>_toggleSwitch.thumbTintColor = ;</code> 切换显示为白色,然后在交互过程中或 View 破坏时与 bad_exec 一起崩溃(转换回主视图时/<code>self removeFromSuperview</code>)。在使用实例函数转换到 View 之前,我已经尝试过这样做,我已经尝试在 <code>-awakeFromNib</code> 和 <code>-didMoveToWindow</code> 上执行此操作,但没有运气。我已经尝试将颜色保存在类的强属性中。唯一有效的是使用内置常量 - 例如<code>_toggleSwitch.thumbTintColor = </code>。 </p>

<p>如何在不崩溃的情况下自定义这些开关的外观?我什至尝试通过覆盖 View 的设置函数从我的呈现 ViewController 传递自定义 UIColor 对象,就像我将文本传递给 <code>textfield.text</code> 和图像传递给 <code>imageview 一样。图像</code> - 通过将其分配给 <code>self.toggleswitch.thumbTintColor</code> 并且它 <em>still</em> 会导致错误的执行。如何自定义我的 xib 中的开关?</p>

<p>编辑:好的,我不认为代码具有启发性,但这是覆盖层</p>

<pre><code>overlay.h
@property (strong, nonatomic) IBOutlet UISwitch *switchFB;
</code></pre>

<p>这在 -awakeFromNib/xib 中的其他任何地方都可以正常工作</p>

<pre><code>Overlay.m
_switchFB.thumbTintColor = ;
</code></pre>

<p>这会导致 exc_bad_access</p>

<pre><code>_switchFB.thumbTintColor = ;
</code></pre>

<p>当我试图转换回 superView 时(或者有时与修改后的切换交互时)抛出异常:</p>

<pre><code>- (IBAction)buttonCancelClick:(id)sender {
[UIView transitionWithView:self.superview
                  duration:0.5
                   options:UIViewAnimationOptionTransitionCurlUp
                animations:^{
                  ;
                }
                completion:nil
   ];
}
</code></pre>

<p>我认为这与对创建的 UIColor 对象的内存访问有关。我在访问传递给 Overlay 以初始化文本和 ImageView 的对象时没有问题,因此我修改了初始化这些对象的设置函数(从 parentVC 调用)以初始化我的开关。这仍然崩溃。</p>

<pre><code>Overlay.h
@property (strong, nonatomic) IBOutlet UITextView *textField;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;

Overlay.m
- (void)setup:(UIImage *)img text:(NSString *)txt color:(UIColor *)col
{
self.switchFB.thumbTintColor = col;
self.textField.text = txt;
self.imageView.image = img;
}


ParentVC.m
OverlayPublish *olay = [ loadNibNamed:@&#34;OverlayPublish&#34;owner:self options:nil];
text:@&#34;test txt&#34; color:];
[UIView transitionWithView:self.view.superview.superview
                  duration:0.5
                   options:UIViewAnimationOptionTransitionCurlDown
                animations:^{
                  ;
                }
                completion:nil
</code></pre>

<p>Edit2:堆栈跟踪 - 我回到 removeFromSuperView。</p>

<blockquote>
<ul>
<li><p>thread #1: tid = 0x1c03, 0x01d8209b libobjc.A.dylib`objc_msgSend + 15, stop reason = EXC_BAD_ACCESS (code=1, address=0x51019e21)</p>

<p>frame #0: 0x01d8209b libobjc.A.dylib`objc_msgSend + 15</p>

<p>frame #1: 0x0224d41c CoreFoundation`CFRelease + 108</p>

<p>frame #2: 0x02272e54 CoreFoundation`- + 196</p>

<p>frame #3: 0x01d849ff libobjc.A.dylib`- + 47</p>

<p>frame #4: 0x01d73927 libobjc.A.dylib<code>ReleaseValue
std::for_each&lt;__gnu_cxx::__normal_iterator&lt;objc_references_support::ObjcAssociation*, std::vector&lt;objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator&lt;objc_references_support::ObjcAssociation&gt; &gt; ,ReleaseValue&gt;(__gnu_cxx::__normal_iterator&lt;objc_references_support::ObjcAssociation*, std::vector&lt;objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator&lt;objc_references_support::ObjcAssociation&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;objc_references_support::ObjcAssociation*, std::vector&lt;objc_references_support::ObjcAssociation, objc_references_support::ObjcAllocator&lt;objc_references_support::ObjcAssociation&gt; &gt; &gt;, ReleaseValue) + 72
frame #5: 0x01d73632 libobjc.A.dylib</code>_object_remove_assocations + 296</p>

<p>frame #6: 0x01d7a7aa libobjc.A.dylib`objc_destructInstance + 60</p>

<p>frame #7: 0x01d7a7cf libobjc.A.dylib`object_dispose + 20</p>

<p>frame #8: 0x00b2601a UIKit`- + 217</p>

<p>frame #9: 0x01d849ff libobjc.A.dylib`- + 47</p>

<p>frame #10: 0x00c0df90 UIKit`- + 752</p>

<p>frame #11: 0x00b4199c UIKit`- + 93</p>

<p>frame #12: 0x00b497fb UIKit`- + 190</p>

<p>frame #13: 0x00b43ee5 UIKit`- + 375</p>

<p>frame #14: 0x00d06a01 UIKit`- + 288</p>

<p>frame #15: 0x00b4199c UIKit`- + 93</p>

<p>frame #16: 0x00b497fb UIKit`- + 190</p></li>
</ul>
</blockquote></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是特定于 UISwitch 的 SDK 中的错误。 <a href="https://stackoverflow.com/questions/12972500/uiswitch-setthumbtintcolor-causing-crash-ios-6-only" rel="noreferrer noopener nofollow">UISwitch setThumbTintColor causing crash (iOS 6 only)?</a> </p>

<p>在将 UIColor 函数变量分配给 nib 的 UISwitch thumbTintColor 属性之前调用它可以解决崩溃问题。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 初始化 NIB 加载控件 - EXC_BAD_ACCESS 销毁,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18035637/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18035637/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 初始化 NIB 加载控件 - EXC_BAD_ACCESS 销毁