• swift4.0下,使用字符串创建方法,发现无参数的可以实现,有参数的却怎么都调不了。用字符串创建方法哦,不是直接写方法名。 #selector(test:(string:)) 用上面这种是必须要实现了该方法才能用,且不是从字符串直接...
  • 最近使用swift,翻译OC的代码时,发现performSelector的返回值与OC中的用法相差很大。在OC中返回的是ID类型,而swift中返回的是 Unmanaged! 类型,见下图。 在以前OC中,使用performSelector,直接接受返回值,...

    最近使用swift,翻译OC的代码时,发现performSelector的返回值与OC中的用法相差很大。在OC中返回的是ID类型,而swift中返回的是 Unmanaged<AnyObject>! 类型,见下图。


    在以前OC中,使用performSelector,直接接受返回值,然后转成需要的类型进行操作就可以了,但是在swift中是不行的,下面是按OC直接翻译成swift的代码,基本原理是target-action,由mediator发送消息给target,触发target的getPerson()方法,然后创建一个person对象,在外部获取这个person对象,并调用person的run()方法,具体代码及结果如下。



    从以上代码可见,并没有想OC一样获得person对象,下面打断点来看一下,具体发生了什么事。

    首先可以确定,通过performSelector的方法,有触发getPerson()方法,且返回了person对象。


    但是,在外部接受时,这里的person并不是我们需要的person对象,而是一个Unmanaged<AnyObject>! 类型,且可以看在这个类型里面包含了person这个对象,然后我在playground上试验了一下,发现这个类型里面的value就是我需要的值

    让我们来看看Unmanaged<AnyObject>! 是个什么东西

    通过文档的字面意思理解,这东西应该是一个用来管理对象的东西,这里看到了有关于value的方法,然后改动一下代码,再看验证。



    这样就拿到需要的person对象了。

    但是,这事还没完,写这篇博客,其实还有一个原因,我在使用swift写target-action组件化中间件时,遇到了对象提前释放的问题,那么代码就需要这样写

    如果是内存泄露,只要把retain改成release就可以了。

    展开全文
  • swift 下的performSelector的伪装实现。

    作者:fengsh998
    原文地址:http://blog.csdn.net/fengsh998/article/details/35842441
    转载请注明出处
    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!


    在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了。更有甚者连IMP, objc_msgSend也不能用了。虽然想不通为什么,但应该有他的道理。就不纠结了。

    大家可能在OC中使用得更多的就是延时处理,及后台处理,或线程异步等。现在没有performSelector,哪在swift还有什么可以代替呢,当然有了,如GCD,NSTimer其实都可以近似的代替。

    如:NSTimer 

    let tm = NSTimer(timeInterval: 3.0, target: self, selector: "selectorfunc:", userInfo: nil, repeats: false)
            tm.fire()

    但个人感觉使NSTimer有个传上下文时获取与performSelector不一样。从上下文中拿到的是NSTimer需要再取userInfo才可以。但不管怎么样,可以实现延时处理。


    另外,我还自己做了一个swift 的扩展类(OC的catagray) 同样伪装了一个performselector方法。为什么讲是伪装,因为过程中在调用最终的selector时,用了线程处理。而不是理想的msgSend的方式(swift没有开源,没法看到实现,又不提供IMP,查了好多资料都没有讲执行Selector 的,如有大神发现,请告诉我。。。)

    实现:

    //
    //  ExpandNSObject.swift
    //  MixDemo
    //
    //  Created by apple on 14-6-29.
    //  Copyright (c) 2014年 fengsh. All rights reserved.
    //
    
    import Foundation
    
    extension NSObject
    {
        func performSelectorOnMainThread(selector aSelector: Selector,withObject object:AnyObject! ,waitUntilDone wait:Bool)
        {
            if self.respondsToSelector(aSelector)
            {
                var continuego = false
                let group = dispatch_group_create()
                let queue = dispatch_queue_create("com.fsh.dispatch", nil)
                dispatch_group_async(group,queue,{
                    dispatch_async(queue ,{
                        //做了个假的
                        NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: object)
                        continuego = true
                    })
                    })
                dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
    
                if wait
                {
                    let ret = NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as NSDate)
                    while (!continuego && ret)
                    {
                        
                    }
                }
            }
        }
        
        func performSelector(selector aSelector: Selector, object anArgument: AnyObject! ,delay afterDelay:NSTimeInterval)
        {
            if self.respondsToSelector(aSelector)
            {
                let minseconds = afterDelay * Double(NSEC_PER_SEC)
                let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(minseconds))
    
                dispatch_after(dtime,dispatch_get_current_queue() , {
                    //做了个假的
                    NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: anArgument)
                    })
            }
        }
    }

    测试使用:

            self.performSelector(selector:"refreshTable:", object:nil ,delay:3.0)
            self.performSelectorOnMainThread(selector:"refreshTable:", withObject:nil,waitUntilDone:true)
    警告,如果使用performSelector最终执行的selector是在子线程中,如果seleoctor中有更新UI操作,需要回到主线程。就这点没有伪装好,真失败。。。。

    大家在使用过种中请谨慎,别外,如果有发现BUG,请告诉我。。。。。谢谢。

    别附swift源码文件位置:
    http://download.csdn.net/detail/fengsh998/7569569

    展开全文
  • 1. 最简单的方法 拖拽, 这个就不用多解释了吧. 直接从一个视图控制器拖拽到另一个视图控制器, 选择 show, 就行了. 2. 利用 Segue 方法 (这里主要是 方法1 的传值) 连好线, 点击 连线中间部分, 设置 ...
    1. 最简单的方法


    拖拽, 这个就不用多解释了吧. 直接从一个视图控制器拖拽到另一个视图控制器, 选择 show, 就行了.


    2. 利用 Segue 方法 (这里主要是 方法1 的传值)


    连好线, 点击 连线中间部分, 设置 Identifier. (设置Identifier)点击连线的大胖圆点然后输入Identifier即可


    然后 调用 perform SegueWithIdentifier 方法.





    执行以下 方法, 就可以进行 跳转操作了.
    1. performSegueWithIdentifier("SecondSegue", sender: “参数”)



    如何传值?


    很简单, 需要调用 prepareForSegue 方法 (因为这里是 父视图 -> 子视图 传值, 所以要用 destinationViewController)
    1. override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    2.     var theSegue = segue.destinationViewController as! "控制器的类"
    3.     theSegue.text = "Pass"//赋值的内容
    4. }









    展开全文
  • 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了。更有甚者连IMP, objc_msgSend也不能用了。虽然想不通为什么,但应该有他的道理。就不纠结了。 大家可能在OC中使用得更多的就是延时处理...

    在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了。更有甚者连IMP, objc_msgSend也不能用了。虽然想不通为什么,但应该有他的道理。就不纠结了。

    大家可能在OC中使用得更多的就是延时处理,及后台处理,或线程异步等。现在没有performSelector,哪在swift还有什么可以代替呢,当然有了,如GCD,NSTimer其实都可以近似的代替。

    如:NSTimer 

    1. let tm = NSTimer(timeInterval: 3.0, target: self, selector: "selectorfunc:", userInfo: nil, repeats: false)  
    2.         tm.fire()  

    但个人感觉使NSTimer有个传上下文时获取与performSelector不一样。从上下文中拿到的是NSTimer需要再取userInfo才可以。但不管怎么样,可以实现延时处理。


    另外,我还自己做了一个swift 的扩展类(OC的catagray) 同样伪装了一个performselector方法。为什么讲是伪装,因为过程中在调用最终的selector时,用了线程处理。而不是理想的msgSend的方式(swift没有开源,没法看到实现,又不提供IMP,查了好多资料都没有讲执行Selector 的,如有大神发现,请告诉我。。。)

    实现:

    1. //  
    2. //  ExpandNSObject.swift  
    3. //  MixDemo  
    4. //  
    5. //  Created by apple on 14-6-29.  
    6. //  Copyright (c) 2014年 fengsh. All rights reserved.  
    7. //  
    8.   
    9. import Foundation  
    10.   
    11. extension NSObject  
    12. {  
    13.     func performSelectorOnMainThread(selector aSelector: Selector,withObject object:AnyObject! ,waitUntilDone wait:Bool)  
    14.     {  
    15.         if self.respondsToSelector(aSelector)  
    16.         {  
    17.             var continuego = false  
    18.             let group = dispatch_group_create()  
    19.             let queue = dispatch_queue_create("com.fsh.dispatch", nil)  
    20.             dispatch_group_async(group,queue,{  
    21.                 dispatch_async(queue ,{  
    22.                     //做了个假的  
    23.                     NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: object)  
    24.                     continuego = true  
    25.                 })  
    26.                 })  
    27.             dispatch_group_wait(group, DISPATCH_TIME_FOREVER)  
    28.   
    29.             if wait  
    30.             {  
    31.                 let ret = NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as NSDate)  
    32.                 while (!continuego && ret)  
    33.                 {  
    34.                       
    35.                 }  
    36.             }  
    37.         }  
    38.     }  
    39.       
    40.     func performSelector(selector aSelector: Selector, object anArgument: AnyObject! ,delay afterDelay:NSTimeInterval)  
    41.     {  
    42.         if self.respondsToSelector(aSelector)  
    43.         {  
    44.             let minseconds = afterDelay * Double(NSEC_PER_SEC)  
    45.             let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(minseconds))  
    46.   
    47.             dispatch_after(dtime,dispatch_get_current_queue() , {  
    48.                 //做了个假的  
    49.                 NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: anArgument)  
    50.                 })  
    51.         }  
    52.     }  
    53. }  

    测试使用:

    1. self.performSelector(selector:"refreshTable:", object:nil ,delay:3.0)  
    2. self.performSelectorOnMainThread(selector:"refreshTable:", withObject:nil,waitUntilDone:true)  
    警告,如果使用performSelector最终执行的selector是在子线程中,如果seleoctor中有更新UI操作,需要回到主线程。就这点没有伪装好,真失败。。。。

    大家在使用过种中请谨慎,别外,如果有发现BUG,请告诉我。。。。。谢谢。

    别附swift源码文件位置:
    http://download.csdn.net/detail/fengsh998/7569569

    展开全文
  • 主要总结了Swift3.0延迟加载的几种实现方法

    最近在用Swift开发项目,其中用到延迟加载,顺便整理了下3.0改版之后的延迟加载实现方法。

    可以用4种方式实现延迟加载,下面就一一介绍

    1.使用perform方式,代码如下

    perform(#selector(scrollViewDidEndDecelerating), with: self, afterDelay: 0.4)


    2.使用GCD方式,代码如下

            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.4) {

                self.scrollViewDidEndDecelerating(self.adScrollView)

            }

    3.使用定时器方式,代码如下

    Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(scrollViewDidEndDecelerating), userInfo: nil, repeats: false)


    4.使用最原始线程方式,代码如下

            let thread:Thread = Thread {

                Thread.sleep(forTimeInterval: 0.4)

                self.scrollViewDidEndDecelerating(self.adScrollView)

            }

            thread.start()

    Swift 3.0 和之前的书写风格还是有很大不同的,小弟也在学习摸索中,希望和大家共同进步
    展开全文
  • swift知识点--反射

    2018-04-20 11:06:27
    反射创建对象和方法class TestSW: NSObject { override required init() { print("init333333") } @objc func test(){ print("000") } @objc func test11(from:String){ print("...
  • 记录一下swift中NSClassFromString正确的使用方法 func pgcompanyTextFTapOne(_ sender:Any?){ //第一步:获取项目名称 let clsName = Bundle.main.infoDictionary!["CFBundleExecutable"] as? ...
  • swift performSelector

    2020-03-12 23:31:00
    swift并没有提供performSelector ,我伪代码写了一个扩展类。使用时请小心。详见我博文说明。http://blog.csdn.net/fengsh998/article/details/35842441
  • 看了stanford大学的公开课视频,按照上面...method"performOperation" with Objective-c selector"performOperation:"conflicts with previous declaration with the same Obejctive-c selector. func performOper
  • 最后给出了 UIDevice 的使用方法,包括可以访问设备名称,系统版本,UUID,监测电量变化,电池电量状态,监测屏幕方向变化,以及监测iPhone 是否在接近用户的身体。 UIDevice UIDevice 是 UIKit 框架下Core App 中的...
  • @param aSelector 方法选择器 @param objects 参数数组(注意数量和类型要和s选择器保持一致) @return 返回值,方法无返回值时返回nil */ -(id)performSelector:(SEL)aSelector withObjects:(NSArray *)objects{ ...
  • Swift 重写类方法

    2014-07-28 21:59:56
    我有个NFSRacingFinishedHintView类继承于Objective-C的类,
  • 在上一篇博文我们将了《Swift初始化(Initialization)》,既然有了初始化的方法Swift也提供了销毁的通知方法。 deinit只能在引用类型中使用,也就是只能在类中使用。 deinit { // perform the deinitialization }...
  • 最近在回答StackOverflow的问题时,发现performSelector方法Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector: method and related selector-invoking methods are not ...
  • Swift关键字总结上篇

    2019-06-20 11:11:21
    Swift 中有多少关键字? 在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中、语句中、表达式中、类中、模式中, 还有以数字符号#开头的关键字, 以及特定上下文环境使用的关键字。 本文中涉及的代码...
  • 神奇的 Swift 错误处理

    2016-08-01 10:54:02
    原文:Magical Error Handling in Swift 作者: Gemma Barlow 译者:kmyhy Swift 中的错误处理从 O-C 沿袭而来,但 Swift 1.0 之后逐渐发生了巨大改变。重要的改变发生在 Swift 2,它率先使用了“处理非异常的...
  • Swift父类重写

    2018-11-11 19:53:16
    class Student: Person { //创建一个类Student并继承与Person,定义属性name,在Student中监听属性name的setter和getter var name:String="小明"{ willSet(newValue){ print("...
1 2 3 4 5 ... 20
收藏数 2,215
精华内容 886