Mac OS X 网络限速方法

开发中经常需要限制网格速度来进行一些调试,此时可以用ipfw来配置网络带宽来达到限速的目的

sudo ipfw add pipe 1 ip from any 80 to any via en0

这里的两个any可以根据实际情况来配置要做限制的ip段 后面80是端口 en0为网络接口

sudo ipfw pipe 1 config bandwidth 30Kbyte/s

这里30Kbyte/s为要限制的带宽,unlimited为不限速,再次执行这行命令可以修改要限制的带宽

 

另有图形化工具一枚 http://www.hanynet.com/waterroof/index.html

 

在linux 中可以使用 iptables

iptables -A FORWARD -m limit -s 61.155.141.16 –limit  700/s -j ACCEPT

iptables -A FORWARD -s 61.155.141.16 -j DROP

 

 

查看剩余内存

#import <mach/mach.h>
#import <mach/mach_host.h>

void print_free_memory ()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;

host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);

vm_statistics_data_t vm_stat;

if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");

/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}

http://stackoverflow.com/questions/10648902/how-to-get-available-memory-in-ios

关于自定义 UITableViewCell

自定义UITableViewCell的方法有很多 发现一些人都会遇到自己定义的cell里面图片错乱的问题 这个问题往往是因为没有实现prepareForReuse这个方法导致的.

UITableViewCell在向下滚动时复用, 得用的cell就是滑出去的那些, 而滑出去的cell里显示的信息就在这里出现了 解决的方法就是在UITableViewCell的子类里实现perpareForReuse方法, 把内容清空掉

比如

- (void)prepareForReuse
{
    [super prepareForReuse];
    self.myImageView.image = nil;
}

Objective-C 中的 +load 与 +initialize

Objective-C中有个个类初始化方法
+(void)initialize;
+(void)load;

initialize 会在运行时仅被触发一次,如果没有向类发送消息的话,这个方法将不会被调用。这个方法的调用是线程安全的。父类会比子类先收到此消息。

如果希望在类及其Categorgy中执行不同的初始化的话可以使用+load
+(void)load; 在Objective-C运行时载入类或者Category时被调用
这个方法对动态库和静态库中的类或(Category)都有效.

在Mac OS X 10.5及之后的版本,初始化的顺序如下:
1. 调用所有的Framework中的初始化方法
2. 调用所有的+load方法
3. 调用C++的静态初始化方及C/C++中的__attribute__(constructor)函数
4. 调用所有链接到目标文件的framework中的初始化方法
另外
* 一个类的+load方法在其父类的+load方法后调用
* 一个Category的+load方法在被其扩展的类的自有+load方法后调用
在+load方法中,可以安全地向同一二进制包中的其它无关的类发送消息,但接收消息的类中的+load方法可能尚未被调用。

下面是一个关于load的例子

#import <Foundation/Foundation.h>
#define LOAD +(void)load{NSLog(@"%s", __PRETTY_FUNCTION__);}
#define DEF_CLASS(clsName) @interface clsName : NSObject \
@end \
@implementation clsName \
LOAD \
@end
DEF_CLASS(C1)
DEF_CLASS(C2)

@interface C1 (Hello)
+ (void)hello;
@end
@implementation C1 (Hello)
LOAD
+ (void)hello
{
    NSLog(@"Hello");
}
@end

@interface C2 (Hello)
@end
@implementation C2 (Hello)
+ (void)load
{
[C1 hello];
}
@end

int main(int argc, char ** argv) {
    [[C2 alloc]init]; // 向C2发送消息
    return 0;
}

结果为

% gcc -o test test.m -framework Foundation
% ./test
2012-04-22 23:14:18.853 test[20037:903] +[C2 load]
2012-04-22 23:14:18.856 test[20037:903] +[C1 load]
2012-04-22 23:14:18.856 test[20037:903] Hello
2012-04-22 23:14:18.857 test[20037:903] +[C1(Hello) load]

iOS 首屏的图标圆角究竟是多少

在图标的设计中会在ps上画出一个Demo来查看最终的效果,这里就需要自己绘制一个圆角的蒙板或者用其它方法来完成这一效果,这个圆角的半径究竟是多少呢?

在早期的iPhone/iPod中图标尺寸为57×57圆角半径为10px
之后的版本中的图标尺寸就是按照这个比例来缩放的
如果是114×114的图标圆角半径为 114*(10/57) = 20

其它的一些例子:
Icon512.png – 512px – 89.8245614035098
Icon.png – 57px – 10
Icon@2x.png – 114px – 20
Icon-72.png – 72px – 12.6315789473686
Icon-72@2x.png – 144px – 25.2631578947371
Icon-Small.png – 29px – 5.08771929824567
Icon-Small@2x.png – 58px – 10.1754385964913

TTModelViewController

TTModelViewController提供了一个机制来使View的展现与Model同步

TTModelViewController中设置了一系列标志位来存储Model与View的当前状态,通过UpdateViewState来更新View的内容

isModelXXXisInvalid的标记在相应操作生效后置1然后在调用回调后置0

isModelDidRefreshInvatrd  刷新后置1,执行完回调后置0
isModelWillLoadInvalid 在模型开始加载后置1
isModelDidLoadInvalid
isModelDidLoadFirstTimeInvalid
isModelDidShowFirstTimeInvalid
isViewInvalid
isViewSuspended 在ModelDidBeginUpdate和ModelDidEndUpdates中间为YES
isUpdatingView  updateView方法开始置1结束置0
isShowingEmpty
isShowingLoading
isShowingModel  己加载|!shouldLoad
isShowingError

私有方法:

resetViewStates:
判断几种视图的展示状态(加载中、展示模型、出错、空模型),如果开启则关闭.

updateViewStates
根据flag来更新视图的状态
在refresh中置isViewInvalid和isModelDidRefreshInvalid为NO

刷新的策略
从未加载过的Model使用内存+磁盘+网络缓存
加载过的Model使用网络缓存
判断为需要加载更多的使用内存+磁盘+网络缓存
其他的置isModelDidLoadInvalid为YES,如果View didAppear 则更新View([self updateView])

工作流程
在View加载前后设置 _isViewAppearing和_hasViewAppeared
viewWillAppear中在标记位设置后调用[self updateView]和父类viewWillAppear

– (void)updateView
在View无效的情况下如果View没有休眠也没有在更新中(isUpdatingView)则执行以下代码
设置isUpdatingView为YES
实例化Model
实例化View
[self updateViewStates]
如果当前控制器有冻结状态并且isShowingModel置YES则从_frozenState中恢复并结释放_frozenState
标记isViewInvalid和isUpdatingView为NO
[self reloadIfNeeded]

TTViewController会在viewWillAppear和viewDidAppear中暂停网络连接队列

从Three20中学到的一些方法

获取UIView的 Controller
使用 [UIResponder nextResponder]方法

http://developer.apple.com/library/mac/#qa/qa1490/_index.html
64位桌面程序个iOS程序的链接器中有一个Bug会使链接器中的-ObjC标识不起做用,Three20中使用了一个宏来结决这个问题
#define TT_FIX_CATEGORY_BUG(name) @interface TT_FIX_CATEGORY_BUG_##name @end \
@implementation TT_FIX_CATEGORY_BUG_##name @end
这里定义了一个类的实现来防止编译器忽略掉Catelog和不包含类的文件

Three20 UINavigator

Three20 UINavigator

TTGlobalNavigatorMetrics
屏幕方向 大小 导航大小 键盘大小 状态栏大小 工具栏大小


TTURLObject @protocol
NSString *URLValue
– (NSString*)URLValueWithName:(NSString*)name;


TTBaseNavigationController

– (void)pushViewController: (UIViewController*)controller
animatedWithTransition: (UIViewAnimationTransition)transition;
动画推入新的界面

– (UIViewController*)popViewControllerAnimatedWithTransition:(UIViewAnimationTransition)transition;
动画推出当前界面


TTNavigatorRootContainer 定义了导航对象的根控制器设定与获取控制器的导航对象方法
– (void)navigator:(TTBaseNavigator*)navigator setRootViewController:(UIViewController*)controller;
– (TTBaseNavigator*)getNavigatorForController:(UIViewController*)controller;


TTBaseNavigator
自动持久化ViewController
包含 URLMap,
读写 window, rootContainer
只读 rootViewController, visibleViewController, topViewController
读写 URL 打开或获取当前的URL
读写 persistenceMode 持久化控制器的方法,默认不缓存
persistenceExpirationAge 缓存时间

读写 supportsShakeToReload 是否支持摇晃刷新
读写 opensExternalURLs 是否支持打开外链
读写 isDelayed 是否有任务延迟加载

/**
* Determines the navigator that contains this view.
*
* Traverse the view hierarchy until the root view container is reached. If this root container
* conforms to the TTNavigatorRootContainer protocol, we call getNavigatorForController:
* with the top-most controller that contains this view that /isn’t/ the container.
* If getNavigatorForController: returns a navigator, this navigator is returned.
* Otherwise, the global navigator is returned.
*
* If the given view is not, in fact, a view, which is the case if a UIBarButtonItem is passed,
* returns the global navigator via [TTBaseNavigator globalNavigator].
*
* If you need to use a specific navigator for UIBarButtonItem, handle the button tap
* yourself and use navigatorForView: on an actual view in the controller.
*/
+ (TTBaseNavigator*)navigatorForView:(UIView*)view;
判断包含view的导航
如果在点击TabBarButton后要使用某个Navigator可以用此方法

+ (TTBaseNavigator*)globalNavigator;
+ (void)setGlobalNavigator:(TTBaseNavigator*)navigator;

打开URL
– (UIViewController*)openURLAction:(TTURLAction*)URLAction;
– (UIViewController*)openURLs:(NSString*)URL,…; 打开一系列URL,结果为最后的URL

获取URL对应的Controller
– (UIViewController*)viewControllerForURL:(NSString*)URL;
– (UIViewController*)viewControllerForURL:(NSString*)URL query:(NSDictionary*)query;
– (UIViewController*)viewControllerForURL:(NSString*)URL query:(NSDictionary*)query
pattern:(TTURLPattern**)pattern;

– (void)beginDelay;
初始化控制器可能非常占用耗时和资源,如果在动画的过程中发生会应响用户的体验
通过这个方法可以在让导航器在生成控制器后再动论

– (void)endDelay
– (void)cancelDelay

– (void)persistViewControllers;
持久化所有

– (UIViewController*)restoreViewControllers
恢复控制器

– (void)persistController:(UIViewController*)controller path:(NSMutableArray*)path;

– (void)removeAllViewControllers;
去除并释放

对象与URL的映射
– (NSString*)pathForObject:(id)object;
– (id)objectForPath:(NSString*)path;
– (void)resetDefaults; 清空持久化的数据

Three20 Core

TTGlobalCore

TTGlobalCore对Foundation Framework的扩展

创建不retain对象的集合 (通过对CFArray对象的retain, release赋以函数形式实现)
TTCreateNonRetainingArray()
TTCreateNonRetainingDictionary()

判断对象是否为集合
TTIsArrayWithItems(id object)
TTIsSetWithItems(id object)

判断字符串
TTIsStringWithAnyText(id object)

交换objc方法 (objc runtime)
TTSwapMethods(Class cls, SEL originalSel, SEL newSel)


TTGlobalCoreLocal
包含了与本地化相关的代码
TTCurrentLocal()
从standard user defaults中获取”AppleLanguages”(NSArray)中第一个的值,如果为空则调用[NSLocal currentLocal]

TTLocalizedString(NSString* key, NSString* comment)
从Three20.bundle中[bundle localizedStringForKey:key value:key table:nil]

TTDescriptionForError
如果error.domain为NSURLErrorDomain{本地化 NSURLErrorTimedOut, NSURLErrorNotConnectedToInternet 这两项错误,其它的显示为”Connection Error”的本地话字符串}

TTFormatInteger(NSInteger num)
以逗号分隔形式格式化整数


TTGlobalCorePaths
包函URL判断与设置默认Bundle及从默认bundle中取出资源的代码
TTIsBundleURL(NSString* URL) URL是否以”bundle://”开头
TTIsDocumentsURL(NSString* URL) URL是否以”document://”开头
TTSetDefaultBundle(NSBundle* bundle)
NSBundle* TTGetDefaultBundle()
NSString* TTPathForBundleResource(NSString* relativePath); 生成bundle的Resource目录中指定文件名的完整目录

NSString* TTPathForDocumentsResource(NSString* relativePath); 生成Documents目录中指定文件名的完整目录


TTGlobalCoreRects
包函与距形CGRect相关的函数
CGRect TTRectContract(CGRect rect, CGFloat dx, CGFloat dy)
CGRect TTRectShift(CGRect rect, CGFloat dx, CGFloat dy)
CGRect TTRectInset(CGRect rect, UIEdgeInsets insets)


NSArrayAdditions
两组遍历每个数组元素使其执行指定的方法
第一组 先复制自身再对复本执行方法,可能对数级元素进行修改
– (void)perform:(SEL)selector;
– (void)perform:(SEL)selector withObject:(id)p1;
– (void)perform:(SEL)selector withObject:(id)p1 withObject:(id)p2;
– (void)perform:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3;
第二组 不复制自身,禁止修改数据元素
– (void)makeObjectsPerformSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2;
– (void)makeObjectsPerformSelector: (SEL)selector
withObject: (id)p1
withObject: (id)p2
withObject: (id)p3;
查找方法
– (id)objectWithValue:(id)value forKey:(id)key;
– (id)objectWithClass:(Class)cls;
– (BOOL)containsObject:(id)object withSelector:(SEL)selector;


NSDataAdditions
两个Hash方法
– (NSString*)md5Hash
– (NSString*)sha1Hash


NSMutableArray
添加非空字串
– (void)addNonEmptyString:(NSString*)string


NSMutableDictionary
– (void)setNonEmptyString:(NSString*)string forKey:(id)key
为key添加非空字串值,不判断key是否为非空


NSObjectAdditions
对performSelector的扩展,允许最多带7个参数
– (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3;
– (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
withObject:(id)p4;
– (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
withObject:(id)p4 withObject:(id)p5;
– (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
withObject:(id)p4 withObject:(id)p5 withObject:(id)p6;
– (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
withObject:(id)p4 withObject:(id)p5 withObject:(id)p6 withObject:(id)p7;


NSStringAdditions
字串的判断
– (BOOL)isWhitespaceAndNewlines;
– (NSDictionary*)queryContentsUsingEncoding:(NSStringEncoding)encoding;
将URL查询字串转为字典,每个key对应一个数组,以应对有多个(相同的key)=value对,无value时value=[NSNull null]
– (NSString*)stringByAddingQueryDictionary:(NSDictionary*)query
在当前字串后添加query,过程中会对query的值做URL Encoding
– (NSString*)stringByRemovingHTMLTags;
– (NSComparisonResult)versionStringCompare:(NSString *)other;
* 示例 (?? 代表不确定):
* “3.0” = “3.0”
* “3.0a2” = “3.0a2”
* “3.0” > “2.5”
* “3.1” > “3.0”
* “3.0a1” < "3.0" * "3.0a1" < "3.0a4" * "3.0a2" < "3.0a19" <-- 不按字典顺序,按数字顺序, 只能用'a' * "3.0a" < "3.0a1" * "3.02" < "3.03" * "3.0.2" < "3.0.3" * "3.00" ?? "3.0" * "3.02" ?? "3.0.3" * "3.02" ?? "3.0.2" - (NSString*)md5Hash - (NSString*)sha1Hash

TTExtensionLoader
添加扩展方法:为TTExtentionLoader浅耕加Catelog
为方法名命为- (BOOL)loadExtensionNamed

+ (void)loadAllExtensions;
调用的唯一方法

+ (NSDictionary*)availableExtensions;

+ (NSDictionary*)loadedExtensions;
+ (NSDictionary*)failedExtensions;


TTEntityTables
XML entity Table ?


TTMarkupStripper
去标签