我的一个实体托管对象需要设置一个仅运行时的树状结构,其中节点是 NSObject 的子类(它们不是托管对象)。
我在两个地方设置了那个结构(并因此分配了一堆节点):
awakeFromFetch 方法中。这就是我遇到问题的地方:对 Node *newNode = [Node alloc]; 的调用永远不会返回。我可以中断使用调试器,并且代码卡在 semaphore_wait_signal_trap 中。这是完整的调用堆栈:
#0 0x937ac0e2 in semaphore_wait_signal_trap ()
#1 0x937b1be6 in pthread_mutex_lock ()
#2 0x01881c73 in _class_initialize ()
#3 0x0188973f in prepareForMethodLookup ()
#4 0x01880069 in lookUpMethod ()
#5 0x018801d6 in _class_lookupMethodAndLoadCache ()
#6 0x018930e3 in objc_msgSend ()
#7 0x000957d8 in -[MyEntity awakeFromFetch] at MyEntity:114
看来我的 Node 类无法初始化。实际上,这是本次 session 中第一次使用 Node 类。为了检查这一点,我在应用程序启动时插入了单个 Node 的虚假分配。调用成功,至此上述问题消失。
但是,我并不满意,原因有二:
1- 我仍然不明白为什么在 awakeFromFetch 中第一次分配一个 Node 会失败。如果我不明白错误发生的原因以及修复为何是实际修复,我就不会认为该错误已修复。
2- 应用程序现在在第一次使用 另一个 类时稍微晚一点崩溃,这次不是在任何 awakeFromFetch 中。
很明显,我的问题与 awakeFromFetch 和 Core Data 无关。不知何故,我的 Objective-C 运行时行为不正常,我不知道为什么。
简单的问题:什么会导致 _class_initialize 进入 p 线程死锁?
确实谷歌搜索 semaphore_wait_signal_trap 产生了很多结果,都与 pthreads 相关,很少与 iOS/Objective-C/Cocoa 相关。
请注意,我在这里根本不使用线程。
我很困惑。知道如何调试吗?
编辑:永不返回的源行是:
Node *newNode = [[Node alloc] init];
为了弄清楚发生了什么,我把它分成两部分:
Node *newNode = [Node alloc];
newNode = [newNode init];
问题出现在这两行中的第一行。
最佳答案
Apple 关于-[NSManagedObject awakeFromFetch] 的文档说:
Important: Subclasses must invoke super’s implementation before performing their own initialization.
你做到了吗?
但是,即使这解决了您的问题,我也不知道为什么 ;)
关于objective-c - iOS 应用程序中 _class_initialize 中的 semaphore_wait_signal_trap 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513482/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中