PerformSelector

<p class="p1"><span class="s1">@interface</span><span class="s2"> AAA : </span><span class="s3">NSObject</span></p>
- (void)aaPublic;

@end

#import "AAA.h"

@implementation AAA

- (void)aaPublic
{
    NSLog(@"%s", __func__);
}

- (void)aaPrivate
{
    NSLog(@"%s", __func__);
}

@end

AAA *a = [[AAA alloc] init];
    [a aaPublic];
    [a aaPrivate];
    [a performSelector:@selector(aaPrivate) withObject:nil];

PerformSelector 和 直接调用的区别

  1. performSelector是运行时系统负责去找方法的,在编译时候不做任何校验。而直接调用在编译期就会直接检查 如果在.h没有公开该方法就会直接报错
  2. performSelector可以调用.m内的私有方法 调用时要记得respondsToSelector来检查一下selector是否存在

PerformSelector的内存问题

SEL sel;
    BOOL a = YES;
    if (a) {
        sel = @selector(test:);
    }
    else {
        sel = @selector(test1:);
    }
    [self performSelector:sel withObject:nil];<p class="p1"><span class="s1"> PerformSelector may cause a leak because its selector is unknown</span></p>

为什么这里会有警告呢

编译器并不知道将要挑中的选择子是什么 也不清楚返回值是什么。而且编译器不知道方法名,没有办法
应用Arc的内存规则来判别。因此ARC采取比较谨慎的做法,就是不添加释放操作。然而这么做可能
导致内存泄露,因为方法在返回对象时可能已经将其保留

PerformSelector一系列方法的区别

1.[selfperformSelector:@selector(test:)withObject:@"0"];

这个方法和当前线程有关,在当前线程执行这个selector

2. /**

     *  这个方法是在主线程执行Selector

     *

     *  @param选择子

     *

     *  @return waitUntilDone Yes等待返回才继续执行  No不用等待结束继续执行

     */

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

NSLog(@"start-1");
    [self performSelectorOnMainThread:@selector(test1:) withObject:@"1111" waitUntilDone:YES];
    NSLog(@"finish-1");
    
    NSLog(@"start-2");
    [self performSelectorOnMainThread:@selector(test1:) withObject:@"222" waitUntilDone:NO];
    NSLog(@"finish-2");

- (void)test1:(NSString *)xxx
{
    sleep(5);
    NSLog(@"xxx");
}


3.指定线程执行

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)arrayNS_AVAILABLE(10_5,2_0);

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5,2_0);

// equivalent to the first method with kCFRunLoopCommonModes

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg


cancelPreviousPerformRequests

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

如果你要指定某个selector被取消,用第一个方法。注意参数都要一样不然取消无效
第二个方法是用来取消之前所有的selector
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值