正文
* @param self 需要添加关联的对象
* @param UIButtonHandlerKey 添加的唯一标识符
* @param handler 关联的对象
* @param OBJC_ASSOCIATION_COPY_NONATOMIC 关联的策略,是个枚举
这句话可以理解为,以OBJC_ASSOCIATION_COPY_NONATOMIC的关联策略为自己添加一个标识符为UIButtonHandlerKey的handler对象。
点进这句话我们可以看到系统对应的关联策略的枚举,有以下几种形式
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0, //< Specifies a weak reference to the associated object.
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //< Specifies a strong reference to the associated object.
The association is not made atomically.
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //< Specifies that the associated object is copied.
The association is not made atomically.
OBJC_ASSOCIATION_RETAIN = 01401, //< Specifies a strong reference to the associated object.
The association is made atomically.
OBJC_ASSOCIATION_COPY = 01403 //< Specifies that the associated object is copied.
The association is made atomically.
};
OK,接下来在看对应的添加的callActionHandler事件中的代码
ActionBlock handler = (ActionBlock)objc_getAssociatedObject(self, &UIButtonHandlerKey);
if (handler) {//判断block是否为null 防止crash
handler(sender);
}
ActionBlock通过标示符UIButtonHandlerKey,得到的之前的管理属性,然后判断如果block不为空,进行下一步的操作。
#####OpenShare+Weibo
我们从调用处着手开始分析一下源码中的一些方法。登录和分享,最先调起的两个方法分别为:
登录
+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail;
分享调起方法
+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;
点击这两个方法我们首先进入到的是OpenShare+Weibo,一个专门用来处理微博的分类中,我们可以看到一共有以下4个方法:
+(void)connectWeiboWithAppKey:(NSString *)appKey;
+(BOOL)isWeiboInstalled;
/**
* 分享到微博,微博只支持三种类型:文本/图片/链接。根据OSMessage自动判定想分享的类型。
*
* @param msg 要分享的msg
* @param success 分享成功回调
* @param fail 分享失败回调
*/
+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;
/**
* 微博登录OAuth
*
* @param scope scope,如果不填写,默认是all
* @param redirectURI 必须填写,可以通过http://open.weibo.com/apps/402180334/info/advanced编辑(后台不验证,但是必须填写一致)
* @param success 登录成功回调
* @param fail 登录失败回调
*/
+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail;
分别用来注册微博相关的key,判断是否安装以及主要的分享登录。
平台和key的设置
每个分类中设置不同的schema,区分平台
+(void)connectWeiboWithAppKey:(NSString *)appKey{
[self set:schema Keys:@{@"appKey":appKey}];
}
调用openShare的设置方法
+(void)set:(NSString*)platform Keys:(NSDictionary *)key{
if (!keys) {
keys=[[NSMutableDictionary alloc] init];
}
keys[platform]=key;
}
-
分享的方法
下面通过分享方法,介绍一下核心的分享的实现方式
+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{
if (![self beginShare:schema Message:msg Success:success Fail:fail]) {
return;
}
NSDictionary *message;
//根据不同的分享形式 设置不同的字典格式
if ([msg isEmpty:@[@"link" ,@"image"] AndNotEmpty:@[@"title"] ]) {
//text类型分享
message= @{
@"__class" : @"WBMessageObject",
@"text" :msg.title
};
}else if ([msg isEmpty:@[@"link" ] AndNotEmpty:@[@"title",@"image"] ]) {
//图片类型分享
message=@{
@"__class" : @"WBMessageObject",
@"imageObject":@{
@"imageData":[self dataWithImage:msg.image]
},
@"text" : msg.title
};
}else if ([msg isEmpty:nil AndNotEmpty:@[@"title",@"link" ,@"image"] ]) {
//链接类型分享
message=@{
@"__class" : @"WBMessageObject",
@"mediaObject":@{
@"__class" : @"WBWebpageObject",
@"description": msg.desc?:msg.title,
@"objectID" : @"identifier1",
@"thumbnailData":msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image scale:CGSizeMake(100, 100)], //三目运算
@"title"