block是个好语法, 可偏偏 IOS 原生的UIAlertView UIActionSheet不支持block,本文将给上述个类添加block的支持,
.h文件
-(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock;
.m文件
-(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock{ self.delegate = self; objc_setAssociatedObject(self, UIActionSheet_key_clicked, aBlock, OBJC_ASSOCIATION_COPY); } -(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, UIActionSheet_key_clicked); if (block) block(buttonIndex); }
按照这种思路将UIAlertView,UIActionSheet 委托全部重写一遍
@interface UIAlertView (Block) -(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock; -(void) handlerCancel:(void (^)(void))aBlock; -(void) handlerWillPresent:(void (^)(void))aBlock; -(void) handlerDidPresent:(void (^)(void))aBlock; -(void) handlerWillDismiss:(void (^)(NSInteger btnIndex))aBlock; -(void) handlerDidDismiss:(void (^)(NSInteger btnIndex))aBlock; -(void) handlerShouldEnableFirstOtherButton:(BOOL (^)(void))aBlock; @end
@interface UIActionSheet (Block) -(void) handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock; -(void) handlerCancel:(void (^)(void))aBlock; -(void) handlerWillPresent:(void (^)(void))aBlock; -(void) handlerDidPresent:(void (^)(void))aBlock; -(void) handlerWillDismiss:(void (^)(void))aBlock; -(void) handlerDidDismiss:(void (^)(NSInteger btnIndex))aBlock; @end
调用的时候
UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:@"title" message:@"msg" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil] autorelease]; [alertView handlerClickedButton:^(NSInteger btnIndex) { NSLogD(@"%d", btnIndex); }]; [alertView show];
其实真这样全部改造下了发先也没简化多少,ui的代码和业务逻辑的代码混在一起了,反而代码更加混乱.
需要dome的同学请自行下载吧
XYQuickDevelop
dome 在点击Something里
NSArray NSMutableArray copy NSArrayNSArray NSMutableArray mutableCopy NSMutableArrayNSDictionary NSMutableDictionary copy NSDictionaryNSMutableDictionary NSDictionary mutableCopy NSMutableDictionary
// // main.m // MutableCopy // // Created by rayln on 13-9-13. // Copyright (c) 2013年 rayln. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" void copy(){ //若要copy自定义的对象,必须实现NSCopying协议, 并且实现copyWithZone方法 Student *stu = [[Student alloc] init]; Student *stu1 = [stu copy]; [stu release]; [stu1 release]; } int main(int argc, const char * argv[]) { @autoreleasepool { #pragma mark - mutablecopy 深拷贝 NSString *str1 = @"100"; NSMutableString *str2 = [str1 mutableCopy]; //copy出来的对象需要释放内存 [str2 release]; #pragma mark - copy 浅拷贝 NSString *string1 = @"101"; NSString *string2 = [string1 copy]; //string1对象和string2对象是同一个对象,因为NSString本来就是不可变的 [string2 release]; Student *stu = [[Student alloc] init]; NSMutableString *name = [[NSMutableString alloc] initWithString:@"rayln"]; NSMutableString *passport = [[NSMutableString alloc] initWithString:@"445281"]; stu.name = name; stu.passport = passport; [name appendString:@"Guan"]; [passport appendString:@"1983"]; //由此可见,retain策略的话,外面重新符值,student的name也会改变 //使用copy策略的话,外面重新符值,student的passport还是没有改变 NSLog(@"Student.name:%@ name:%@", stu.name, name); NSLog(@"Student.passport:%@ passport:%@", stu.passport, passport); [name release]; [passport release]; [stu release]; } return 0; }
Student.h
// // Student.h // MutableCopy // // Created by rayln on 13-9-13. // Copyright (c) 2013年 rayln. All rights reserved. // #import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> //建议NSString对象用copy,其他对象用retain策略 @property (nonatomic, retain) NSString *name; @property (nonatomic, copy) NSString *passport; @end
Student.m
// // Student.m // MutableCopy // // Created by rayln on 13-9-13. // Copyright (c) 2013年 rayln. All rights reserved. // #import "Student.h" @implementation Student //实现copyWithZone方法,使用copy方法必须实现他 - (id)copyWithZone:(NSZone *)zone{ Student *stu = [[Student allocWithZone:zone] init]; stu.name = self.name; stu.passport = self.passport; return stu; } - (void)dealloc{ [_name release]; [_passport release]; [super dealloc]; } @end
设置APN上网时,大家可能经常遇到这个问题:
为什么有时要填写default有时要填写supl,而彩信又偏偏要mms?
这个问题留到最后,让我们看看每个接入点类型的含义:
英文原文来自于Google Android Developers
原文连接:http://developer.android.com/reference/android/net/ConnectivityManager.html
我尽量用通俗易懂的语言来解释每个类型的含义,若您是开发者,请尽量阅读英文原文。
1、default
默认网络连接,当激活时所有数据传输都使用该连接,不能与其他网络连接同时使用
1 2 3 4 5 6
适用场合:绝大部分正常上网时可以使用
2、mms
彩信专用连接,此连接与default类似,用于与载体的多媒体信息服务器对话的应用程序,此连接能与default连接同时使用
1 2 3 4 5 6 7
适用场合:使用彩信服务时,必须有mms类型的接入点,不必选中,应用程序会自动使用此接入点
3、supl
是Secure User Plane Location“安全用户面定位”的简写,此连接与default类似,用于帮助定位设备与载体的安全用户面定位服务器对话的应用程序,此连接能与default连接同时使用
1 2 3 4 5 6 7 8 9
适用场合:需要自动切换wap与net接入点的、需要把手机当临时AP的
对SUPL技术感兴趣的朋友,不妨看下以下文章
SUPL技术(一)http://blog.sina.com.cn/s/blog_537f4a11010008tw.html
SUPL技术(二)http://blog.sina.com.cn/s/blog_537f4a11010008uf.html
SUPL技术(三)http://blog.sina.com.cn/s/blog_537f4a11010008ws.html
SUPL技术(四)http://blog.sina.com.cn/s/blog_537f4a11010008yf.html
4、dun
Dial Up Networking拨号网络的简称,此连接与default连接类似,用于执行一个拨号网络网桥,使载体能知道拨号网络流量的应用程序,此连接能与default连接同时使用
1 2 3 4 5 6 7 8
适用场合:需要使用运营商无线热点的,CMCC、ChinaNet等
5、hipri
高优先级网络,与default类似,但路由设置不同。
只有当进程访问移动DNS服务器,并明确要求使用requestRouteToHost(int, int)才会使用此连接
(这个我也不太懂,翻译的应该很有问题….)
1 2 3 4 5 6 7 8 9