iOS、swift技术交流!

objective-c中模拟c语言的函数调用方法

2016-10-31  本文已影响145人  光明程辉

objective-c中模拟c语言的函数调用方法

在很多第三方objc库中,你会看到一些很优雅的函数调用方法,例如masonry中,定义约束的函数


[row1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.and.left.equalTo(view);
    make.height.equalTo(view.mas_height).multipliedBy(0.25);
    make.top.equalTo(view.mas_top);
}];

** 注意点: **(1)and属性:

对应的源码
- (MASConstraint *)and {
    return self;
}
````objc

and方法什么都没做,只是返回了自己,一个好的方法名,是可以让你写的方法可以读出来,and的存在的意义就是让方法读出来更通顺。我们读下面的两个方法试试看

````objc
make.right.and.left.equalTo(view);//很通顺,可以读出来并且很容易理解其中的意思
make.right.left.equalTo(view);//不通顺,right是什么,怎么还有left对象?

类似的,我们还可以定义一些with,then,together等等,加入这些连词,让方法更优雅。

** 注意点: **(2)方法 objc equalTo(view.mas_height).multipliedBy(0.25)

这种括号式的方法调用体并不是objc的消息式的方法调用,这个符合c语言的方法调用,我们看看背后的实现:


.h中
- (MASConstraint * (^)(id attr))equalTo;
- (MASConstraint * (^)(CGFloat multiplier))multipliedBy;

.m中
- (MASConstraint * (^)(id))equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}

- (MASConstraint * (^)(CGFloat multiplier))multipliedBy { MASMethodNotImplemented(); }

what?这个是什么奇怪的东西? 其实这个就是一个一个objc的方法,返回值是一个block,再实现中,返回一个block执行的结果,我们按照他的模式定义一个add方法试一试


.h
-(int (^)(int a,int b)) add;

.m
-(int (^)(int, int))add{
    return ^int(int a,int b){
        return a+b;
    };
}

方法的调用:

NSLog(@"%d",testClass.add(1,2));

其他疑问

有的人或许觉得直接定义c语言的函数,就能做上面的事情,其实不是的,大家可以写一个试试看。它主要存在2个缺点

int add1(int a,int b){
    return  a+b;
}

上一篇 下一篇

猜你喜欢

热点阅读