调用[UIColor colorWithRed:green:blue:alpha:]导致可怕的崩溃

Eri*_*eut 0 objective-c uicolor ios

摘要:

在UITextField的子类中:

  • [UIColor colorWithRed:green:blue:alpha] 导致应用程序崩溃
  • [UIColor greenColor] 工作正常没有任何问题

怎么可能?

回答:

事实证明,问题layoutSubviews在于我正在调用正在使用的方法colorWithRed.显然会colorWithRed分配额外的内存,这会导致问题.(感谢Johannes Fahrenkrug在评论中指出它可能是其他东西 - 见下文.)

详情:

在作为UITextField的子类的ECTextField类中,当我进行以下调用时,我遇到了可怕的崩溃:

[self setTextColor:[UIColor colorWithRed:42/255.0 green:170/255.0 blue:42/255.0 alpha:0.8]];
Run Code Online (Sandbox Code Playgroud)

该应用程序冻结,挂起,然后一段时间后我收到以下错误:

SampleApp(58375,0x34f71a8) malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
2013-11-14 22:25:11.929 SampleApp[58375:907] *** Terminating app due to uncaught exception 'NSMallocException', reason: '*** NSAllocateObject(): attempt to allocate object of class 'NSPathStore2' failed'
*** First throw call stack:
(0x2362012 0x2166e7e 0x2361deb 0x1b5bcf2 0x1b60148 0x1bdb7a6 0x120f8a3 0x10ccaf2 0x96b14e4 0x10cc84e 0x96b1542 0x130c42 0x120491 0x120308 0x10fb2dd 0x217a6b0 0x3dbfc0 0x3d033c 0x3d0150 0x34e0bc 0x34f227 0x34f8e2 0x232aafe 0x232aa3d 0x23087c2 0x2307f44 0x2307e1b 0x35647e3 0x3564668 0x10aaffc 0x798d 0x25a5)
libc++abi.dylib: terminate called throwing an exception
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我用以下代码替换该行代码,一切正常:

[self setTextColor:[UIColor greenColor]];
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样,我可以尝试解决这个问题?

谢谢你的帮助,

埃里克

Jay*_*jar 6

将其更改为

[self setTextColor:[UIColor colorWithRed:42.0f/255.0f green:170.0f/255.0f blue:42.0f/255.0f alpha:0.8f]];
Run Code Online (Sandbox Code Playgroud)

颜色对象的组件,指定为0.0到1.0之间的值.


Joh*_*rug 6

问题是你有一个无限循环.如果你打电话给[self setTextColor:layoutSubviews您的UITextField子类,您可以创建一个无限循环,因为setTextColor原因layoutSubviews再次呼吁:UITextView的setTextColor在UITableViewCell中改变布局

这就是为什么错误出现需要一段时间的原因:应用耗尽内存.您可以通过使用Instruments运行它来验证这一点.

切勿从layoutSubviews触发器中调用任何东西layoutSubviews.