草庐IT

fno-objc-arc

全部标签

objective-c - Throwing 方法不能是@objc 协议(protocol)的成员,因为它返回类型为 'Bool' 的值

我收到以下错误:Throwingmethodcannotbeamemberofan@objcprotocolbecauseitreturnsavalueoftype'Bool';return'Void'oratypethatbridgestoanObjective-Cclass定义Swift协议(protocol)时也需要桥接到Objective-C:@objcpublicprotocolSaving{funcsave()throws->Bool}是否有其他方法可以定义返回Bool的Swift方法,可能会抛出错误并与Objetive-C兼容? 最佳答案

objective-c - 如何从协议(protocol)方法描述列表中解密 "objc_method_description"?

我有一些Swift3代码来解码iOSObjective-C协议(protocol)(它有一个Swift对应协议(protocol))。在断定Swift3反射还不足以完成我需要的功能后,我偶然发现了objc运行时方法protocol_copyMethodDescriptionList(),它返回以下C结构的数组:structobjc_method_descriptionSELname;char*types;};代码获取协议(protocol)选择器名称列表,但不确定type字段中返回的是什么。我对如何正确解码objc_method_description.type值感到困惑。我在type

swift - 如何使用 ARC 在 Swift 中手动保留?

我在iOS应用程序中使用带有ARC的Swift3,我想手动保留一个对象。我试过object.retain()但Xcode说它在ARC模式下不可用。有没有其他方法可以做到这一点,告诉Xcode我知道我在做什么?长版:我有一个LocationTracker类,它将自己注册为CLLocationManager的委托(delegate)。当用户的位置发生变化时,它会更新一个名为location的静态变量。我的代码中需要位置的其他部分可以访问此静态变量,而无需或不需要引用LocationTracker实例。此设计的问题是委托(delegate)未保留,因此在CLLocationManager向其

swift - 以编程方式创建 UIButton 事件时,@objc 和 IBAction 之间有什么区别吗?

当从Storyboard中的UIButton创建事件处理程序时,Swift在func之前添加了@IBAction。当以编程方式将事件添加到UIButton到func时,Swift报错并说我需要在我的方法前面添加@objc,但是当我添加@IBAction时,它也会编译。将事件添加到我的UIButton以编程方式时,两者之间有区别吗?我应该使用哪个? 最佳答案 IBAction前缀已经将方法公开给Objective-C运行时,因此无需再为它添加前缀@objc。由于IB代表InterfaceBuilder,因此在以编程方式创建按钮时没有必

types - arc4random() 的余数运算符和数组的计数导致 "could not find an overload"错误

这段代码varrandomNumber:Int=arc4random()%nameArray.count给我错误“找不到接受所提供参数的‘%’的重载”我仍在努力适应语法并阅读文档,但似乎无法弄清楚这一点。谁能帮忙? 最佳答案 您必须将arc4random()的返回值(CInt)转换为Int:varrandomNumber:Int=Int(arc4random())%nameArray.count 关于types-arc4random()的余数运算符和数组的计数导致"couldnotfin

objective-c - 以协议(protocol)为参数的 ObjC 泛型集合被翻译为 [AnyObject]

为什么protocols属性在swift中被翻译成[AnyObject],而不是[P]@protocolP;@classC;@interfaceTestGenerics:NSObject@propertyNSArray*classes;@propertyNSArray*protocols;@end在Swift中它看起来是这样的:publicclassTestGenerics:NSObject{publicvarclasses:[C]publicvarprotocols:[AnyObject]}更新:找到解决方案@propertyNSArray*>*protocols;或者喜欢建议的ne

ios - ARC 在解除分配之前是否将其引用类型实例属性设置为 nil?

我在阅读this时想到了这个问题.我的问题引用下图:一旦john设置为nil,Person实例将不再具有任何强引用,因此将被释放。但是Apartment有两个强引用,其中一个是Person实例上的属性,该实例很快就会被释放。我相信,这个强引用在解除分配后会继续保留,并且代码无法访问。因此,将unit14A设置为nil只会删除对Apartment实例的一个强引用,它不应被释放,因为本来会有一个由于上述案例,更具引用性。但是,正如文档所说,Apartment实例很快就被释放了。对我来说,这只有在Person实例释放时才会发生,它通过删除强引用将其apartment属性设置为nil在Apar

ios - 如何快速将 void block 传递给 objc_setAssociatedObject

我正在尝试通过扩展向UIView添加点击手势支持。这使用Objective-C非常简单,但是当我尝试在运行时属性上设置void返回block时出现以下错误。error:type'()->Void'doesnotconformtoprotocol'AnyObject'这是计算属性:vartapAction:(()->Void)?{get{objc_getAssociatedObject(self,&AssociatedKeys.SNGLSActionHandlerTapBlockKey)}set{objc_setAssociatedObject(self,&AssociatedKeys.

ios - ld : SDK. 使用旧版本的 Swift 语言 (XX) 编译的框架比以前的 ObjC 框架文件(未知 ABI 版本 YYY)

简介我正在处理SDK.framework,我需要将其作为闭源软件进行分发。为了涵盖objective-c和swift项目,我决定在objective-c上编写它在本地环境中我有两个项目:SDK(框架源代码)DemoApp(链接到SDK.framework的应用)*这些项目在单独的工作空间中问题当我在本地编译SDK.framework时,它运行完美。一旦我从CI获得一个(它有不同的iOSSDK版本)并尝试将它与DemoApp链接我得到这个错误:ld:SDK.frameworkcompiledwitholderversionofSwiftlanguage(4.0)thanpreviousf

swift - 为什么我可以将 @objc 协议(protocol)声明为弱属性,而不是 swift 协议(protocol)?

我发现如果我创建一个这样的协议(protocol):protocolMyProtocol{}我不能这样做:weakvarmyVar:MyProtocol?我找到了解决这个问题的方法,就是将@objc添加到协议(protocol)声明中:@objcprotocolMyProtocol{}但是为什么这样可以修复错误呢?我的猜测是添加@objc会阻止结构符合协议(protocol),因此变量的值被保证为引用类型。我说得对吗?此外,添加@objc会阻止我添加像[String:Any]这样的swift类型。我也想知道是否有另一种修复错误的方法。 最佳答案