<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_.Net学习者</title><subtitle type="text">努力学习着......</subtitle><id>http://feed.cnblogs.com/blog/u/12813/rss</id><updated>2012-04-25T03:44:49Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/12813/rss"/><entry><id>http://www.cnblogs.com/GoGoagg/archive/2012/03/31/2426475.html</id><title type="text">mac下多线程实现处理</title><summary type="text">mac下实现多线程</summary><published>2012-03-31T02:16:00Z</published><updated>2012-03-31T02:16:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2012/03/31/2426475.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2012/03/31/2426475.html"/><content type="html">&lt;p&gt;mac下线程开启&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;1、新的线程必须考虑设立一个autorelease池处理自动释放的代码。&lt;br /&gt;模版如下：&lt;br /&gt;NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ]; &lt;br /&gt;[code here] &lt;br /&gt;[pool release]; &lt;br /&gt;&lt;br /&gt;如果你能确保自己写的代码自己申请，自己释放的话，不使用autorelease的对象，那么建议：采用自己释放的方式&lt;br /&gt;&lt;br /&gt;2、&lt;br /&gt;下来是Run Loop的使用场合：&lt;br /&gt;1. 使用port或是自定义的input source来和其他线程进行通信&lt;br /&gt;2. 在线程（非主线程）中使用timer&lt;br /&gt;3. 使用 performSelector...系列（如performSelectorOnThread, ...）&lt;br /&gt;4. 使用线程执行周期性工作&lt;br /&gt;&lt;br /&gt;3、说哈线程和NSTimer&lt;br /&gt;http://3426724.blog.51cto.com/3416724/747650&lt;br /&gt;参考这地址，进行实践&lt;br /&gt;&lt;br /&gt;线程执行实现：&lt;br /&gt;- (void)thread3&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"t3 = %@ ,isMainThread = %d ,isMulti = %d" ,[NSThread currentThread] ,[NSThread isMainThread] ,[NSThread isMultiThreaded]);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (YES)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [NSThread sleepForTimeInterval:3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self-&amp;gt;btnBind.hidden = NO;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;手工启动线程：&lt;br /&gt;- (IBAction)bindEmail:(id)sender&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [self Test039];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"over");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;线程启动如下：&lt;br /&gt;- (void)Test038&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// 方法2 能启动，timer事件正常完成下timer退出,timer启动线程能释放,thread3作为非主线程函数执行&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSAutoreleasePool *timerNPool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSRunLoop *runloop = [NSRunLoop currentRunLoop];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(thread3) userInfo:nil repeats:NO];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [runloop run];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [timerNPool release];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// 方法3,结论：启动thread3，作为主线程的一个函数执行&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; NSTimer *timer1 = [NSTimer timerWithTimeInterval:15 target:self selector:@selector(thread3) userInfo:nil repeats:NO];&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; [[NSRunLoop mainRunLoop] addTimer:timer1 forMode:NSDefaultRunLoopMode];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)Test039&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 启动一个线程,线程对应使用timer(未使用方法2和方法3，直接timer)。结论：无法启动timer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //[NSThread detachNewThreadSelector:@selector(Test038) toTarget:self withObject:nil];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [NSThreadManager StartNewThreadWithTarget:self selector:@selector(Test038) object:nil];&lt;br /&gt;}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2426475.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2012/03/31/2426475.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/22/2298196.html</id><title type="text">asihttprequest简单异步</title><summary type="text">asihttprequest</summary><published>2011-12-22T09:30:00Z</published><updated>2011-12-22T09:30:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/22/2298196.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/22/2298196.html"/><content type="html">&lt;p&gt;调试环境：&lt;br /&gt;ASIHTTPRequest版本1.8.1-61 2011-9-19修复版&lt;br /&gt;Xcode版本4.2.1&lt;br /&gt;iOS5.0&lt;br /&gt;Mac OS X10.7.1&lt;br /&gt;&lt;br /&gt;在此代码仅仅捣鼓异步的初步处理&lt;br /&gt;1、需要实现协议接口&lt;/p&gt;&lt;p&gt;ASIHTTPRequestDelegate&lt;/p&gt;&lt;p&gt;&lt;br /&gt;主要requestFailed,requestFinished之类的接口&lt;br /&gt;&lt;br /&gt;2、调用的时候，建议启动异步request的对象和异步处理的对象分开定义&lt;br /&gt;&lt;br /&gt;下面我的代码是启动异步和异步处理定义在一起&lt;br /&gt;&lt;br /&gt;代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;@interface&lt;/span&gt; AsynBaseDeal : NSObject&amp;lt;ASIHTTPRequestDelegate&amp;gt;&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)LoadImage:(NSString *)strUrl;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;@implementation&lt;/span&gt; AsynBaseDeal&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;id&lt;/span&gt;)init&lt;br /&gt;{&lt;br /&gt;    self = [super init];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (self)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)dealloc&lt;br /&gt;{        &lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)LoadImage:(NSString *)strUrl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (strUrl)&lt;br /&gt;    {&lt;br /&gt;        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:strUrl]];&lt;br /&gt;        &lt;br /&gt;        [request setDelegate:self];&lt;br /&gt;        [request startAsynchronous];&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)requestFailed:(ASIHTTPRequest *)request&lt;br /&gt;{&lt;br /&gt;    NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error :%@&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ,[request error]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)requestFinished:(ASIHTTPRequest *)request&lt;br /&gt;{&lt;br /&gt;    NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;finish :%@ ,%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ,[request responseData] ,request.responseEncoding);&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;在使用中，我把AsynBaseDeal对象定义为UIApplication层面的成员变量来用的，这样避免了在异步处理结束前就释放了对应的处理对象&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2298196.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/22/2298196.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2296043.html</id><title type="text">cocoa下的多线程实践</title><summary type="text">cocoa线程</summary><published>2011-12-21T08:51:00Z</published><updated>2011-12-21T08:51:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2296043.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2296043.html"/><content type="html">&lt;p&gt;&lt;br /&gt;线程相关的类:NSThread ,NSOperation ,NSOperationQueue&lt;br /&gt;&lt;br /&gt;在实际应用中可以分为2种方式：&lt;br /&gt;1、使用NSThread&lt;br /&gt;2、使用NSOperation,NSOperationQueue&lt;br /&gt;&lt;br /&gt;前者，和过往window下的线程学习类似；后者，是mac以队列的方式来新建线程。&lt;br /&gt;&lt;br /&gt;针对前者，写部分代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)threadFunc:(&lt;span style="color: #0000ff;"&gt;id&lt;/span&gt;)info&lt;br /&gt;{&lt;br /&gt;    NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%@ ,run thread&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ,info);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)viewDidLoad&lt;br /&gt;{&lt;br /&gt;    [super viewDidLoad];&lt;br /&gt;    [NSThread detachNewThreadSelecor:@selector(threadFunc:) toTarget:self withObject:nil];&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;针对后者，也写些代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;@interface&lt;/span&gt; PageLoadOperation : NSOperation&lt;br /&gt;&lt;br /&gt;@property (retain) NSURL *targetURL;&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;id&lt;/span&gt;)initWithUrl:(NSURL *)url;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;@implementation&lt;/span&gt; PageLoadOperation&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@synthesize&lt;/span&gt; targetURL;&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;id&lt;/span&gt;)init&lt;br /&gt;{&lt;br /&gt;    self = [super init];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (self)&lt;br /&gt;    {&lt;br /&gt;        self-&amp;gt;targetURL = nil;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;id&lt;/span&gt;)initWithUrl:(NSURL *)url&lt;br /&gt;{&lt;br /&gt;    self = [self init];&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (self)&lt;br /&gt;    {&lt;br /&gt;        self-&amp;gt;targetURL = url ? [url retain] : nil;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)dealloc&lt;br /&gt;{    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (self.targetURL)&lt;br /&gt;        [self-&amp;gt;targetURL release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)main&lt;br /&gt;{&lt;br /&gt;    NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;main run&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (self.targetURL == nil)&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    &lt;br /&gt;    NSError *error = nil;&lt;br /&gt;    NSData *data = [[[NSData alloc] initWithContentsOfURL:self.targetURL options:NSDataReadingMappedAlways error:&amp;amp;error] autorelease];&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (error)&lt;br /&gt;        NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error infomation : %@&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ,erro);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (data)&lt;br /&gt;    {&lt;br /&gt;        NSLog(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%@&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ,data);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;调用有两种：&lt;br /&gt;1、直接调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    PageLoadOperation *p = [[PageLoadOperation alloc] initWithUrl:[NSURL URLWithString:&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.sohu.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;]];&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;p.targetURL = [NSURL URLWithString:@"&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://www.baidu.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;"];&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    [p start];&lt;br /&gt;    [p release];&lt;/div&gt;&lt;p&gt;&lt;br /&gt;2、使用NSOperationQueue&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;NSOperationQueue *_queue = [[NSOperationQueue alloc] init];&lt;br /&gt;&lt;br /&gt;PageLoadOperation *plo = [[PageLoadOperation alloc] initWithUrl:[NSURL URLWithString:url]];&lt;br /&gt;plo.&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; = self;&lt;br /&gt;[_queue addOperation:plo];&lt;br /&gt;        &lt;br /&gt;[plo release];&lt;br /&gt;&lt;br /&gt;[_queue release];&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2296043.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2296043.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2295936.html</id><title type="text">xcode开发中碰到错误和异常（不断收集）</title><summary type="text">xcode开发中碰到的错误和异常以及处理</summary><published>2011-12-21T07:43:00Z</published><updated>2011-12-21T07:43:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2295936.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2295936.html"/><content type="html">&lt;p&gt;1、&lt;br /&gt;NSString *webdata = [NSString stringWithContentOfURL:[NSURL URLWithString:@"http://www.baidu.com"] encoding:NSUTF8StringEncoding error:&amp;amp;error];&lt;br /&gt;报错：Error Domain=NSCocoaErrorDomain Code=261&lt;br /&gt;之所以出现这个问题在于编码问题上。百度页面编码是gb2312，本地串是Utf8；把本地修改成兼容gb2312的编码就能正常运行。比如：NSNEXTSTEPStringEncoding&lt;br /&gt;&lt;br /&gt;2、&lt;br /&gt;EXC_BAD_ACCESS，错误一般是由于自动释放引起的，其本质是内存管理问题&lt;br /&gt;&lt;br /&gt;3、&lt;br /&gt;SIGABRT，错误一般使用了该对象或类型无效的方法或属性等引起的，比如：[NSNull null] length,就会引起这个问题，因为此对象没有length方法&lt;br /&gt;&lt;br /&gt;4、&lt;br /&gt;app+lib开发应用程序：&lt;br /&gt;在ios release版本生成时候，如果lib发生改变，app未改变，有可能生成的app是引用的old lib；建议在app代码中某地方新增一个空格，再次编译，这个时候生成的app是引用最新的lib；&lt;br /&gt;在debug或模拟器版本，需要把原有的生产文件删除掉，不然也会存在old app和old lib；&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2295936.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/21/2295936.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/20/2294818.html</id><title type="text">NSCopying协议和copy方法</title><summary type="text">NSCopying协议和copy</summary><published>2011-12-20T08:06:00Z</published><updated>2011-12-20T08:06:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/20/2294818.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/20/2294818.html"/><content type="html">&lt;p&gt;不是所有的对象都支持 copy&lt;br /&gt;需要继承NSCopying 协议（实现 copyWithZone: 方法）&lt;br /&gt;同样，需要继承NSMutableCopying 协议才可以使用mutableCopy（实现 mutableCopyWithZone: 方法）&lt;br /&gt;&lt;br /&gt;默认 NSObject没有实现这两个协议，但是 copy和mutableCopy这两个方法是NSObject定义的&lt;br /&gt;&lt;br /&gt;这里要列举范例&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;//1.h&lt;br/&gt;@interface CommonObj : NSObject&amp;lt;NSCopying&amp;gt;&lt;br/&gt;&lt;br/&gt;@end&lt;br/&gt;&lt;br/&gt;@interface MyCObj : NSObject&amp;lt;NSCopying&amp;gt;&lt;br/&gt;@property (nonatomic ,copy) CommonObj *obj;&lt;br/&gt;@end&lt;br/&gt;&lt;br/&gt;//1.m&lt;br/&gt;@implementation CommonObj&lt;br/&gt;&lt;br/&gt;- (id)init&lt;br/&gt;{&lt;br/&gt;    self = [super init];&lt;br/&gt;    if (self)&lt;br/&gt;    {&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    return self;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;- (void)dealloc&lt;br/&gt;{&lt;br/&gt;    [super dealloc];&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;- (id)copyWithZone:(NSZone *)zone&lt;br/&gt;{&lt;br/&gt;    CommonObj *result = [[[self class] allocWithZone:zone] init];&lt;br/&gt;    return result;&lt;br/&gt;}&lt;br/&gt;@end&lt;br/&gt;&lt;br/&gt;@implementation MyCObj&lt;br/&gt;&lt;br/&gt;@synthesize obj = _obj;&lt;br/&gt;&lt;br/&gt;- (id)init&lt;br/&gt;{&lt;br/&gt;    self = [super init];&lt;br/&gt;    if (self)&lt;br/&gt;    {&lt;br/&gt;        self-&amp;gt;_obj = nil;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    return self;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;- (void)dealloc&lt;br/&gt;{&lt;br/&gt;    if (self.obj)&lt;br/&gt;        [self-&amp;gt;_obj release];&lt;br/&gt;&lt;br/&gt;    [super dealloc];&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;- (id)copyWithZone:(NSZone *)zone&lt;br/&gt;{&lt;br/&gt;    MyCObj *result = [[[self class] allocWithZone:zone] init];&lt;br/&gt;&lt;br/&gt;    result-&amp;gt;_obj = [self-&amp;gt;_obj copy];&lt;br/&gt;&lt;br/&gt;    return result;&lt;br/&gt;}&lt;br/&gt;@end&lt;br/&gt;&lt;br/&gt;//main.m&lt;br/&gt;&lt;br/&gt;- (void)Test&lt;br/&gt;{&lt;br/&gt;    CommonObj *a1 = [[CommonObj alloc] init];&lt;br/&gt;    CommonObj *a2 = [a1 copy];&lt;br/&gt;&lt;br/&gt;    MyCObj *b1 = [[MyCObj alloc] init];&lt;br/&gt;    MyCObj *b2 = [b1 copy];&lt;br/&gt;    [b2 release];&lt;br/&gt;    [b1 release];&lt;br/&gt;&lt;br/&gt;    [a2 release];&lt;br/&gt;    [a1 release];&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;打印上述对象的地址，就会发现地址各不相同，retaincount = 1;&lt;br /&gt;&lt;br /&gt;这里要注意类似NSString的类，比如：NSArray&lt;br /&gt;&lt;br /&gt;NSString *t1 = @"hello";&lt;br /&gt;NSString *t2 = [t1 copy];&lt;br /&gt;&lt;br /&gt;打印地址，两个地址一模一样；NSArray对象也是同样。之所以会是同一地址，估计在常量或不可变这个属性上&lt;br /&gt;&lt;br /&gt;小结：&lt;br /&gt;这个就是C++下的拷贝构造函数的另类描述，目的在于拷贝。至于实现的拷贝是深度拷贝还是浅度拷贝，这是由实现者设计&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2294818.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/20/2294818.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/16/2290295.html</id><title type="text">日期NSDate的使用</title><summary type="text">日期，格式化，NSDate</summary><published>2011-12-16T07:39:00Z</published><updated>2011-12-16T07:39:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/16/2290295.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/16/2290295.html"/><content type="html">&lt;p&gt;日期类NSDate,存储的是世界标准时(UTC)，输出时需要根据时区转换为本地时间&lt;br /&gt;&lt;br /&gt;方法description字符串以GMT=0展示日期&lt;br /&gt;如：2011-11-16 07:02:25 +0000&lt;br /&gt;&lt;br /&gt;测试的北京时间：2011-11-16 15:02:25.324&lt;br /&gt;&lt;br /&gt;/))))((((/&lt;br /&gt;&lt;br /&gt;格式化日期类型，使用NSDateFormatter&lt;br /&gt;&lt;br /&gt;该格式类常用方法：setDateFormat,setTimeZone,dateFromString,stringFromdate&lt;br /&gt;&lt;br /&gt;格式化参数如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;G: 公元时代，例如AD公元&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;yy: 年的后2位&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;yyyy: 完整年&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MM: 月，显示为1-12&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MMM: 月，显示为英文月份简写,如 Jan&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MMMM: 月，显示为英文月份全称，如 Janualy&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dd: 日，2位数表示，如02&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;d: 日，1-2位显示，如 2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;EEE: 简写星期几，如Sun&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;EEEE: 全写星期几，如Sunday&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;aa: 上下午，AM/PM&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;H: 时，24小时制，0-23&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;K：时，12小时制，0-11&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m: 分，1-2位&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mm: 分，2位&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;s: 秒，1-2位&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ss: 秒，2位&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;S: 毫秒&lt;br /&gt;&lt;br /&gt;常用日期结构：&lt;br /&gt;yyyy-MM-dd HH:mm:ss.SSS&lt;br /&gt;yyyy-MM-dd HH:mm:ss&lt;br /&gt;yyyy-MM-dd&lt;br /&gt;MM dd yyyy&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2290295.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/16/2290295.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/14/2287563.html</id><title type="text">where want to go,2012</title><summary type="text">where want to go,2012</summary><published>2011-12-14T06:38:00Z</published><updated>2011-12-14T06:38:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/14/2287563.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/14/2287563.html"/><content type="html">该文被密码保护。</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/12/13/2285682.html</id><title type="text">成员变量的声明位置引起编译错误</title><summary type="text">Xcode 默认编译器对代码的影响</summary><published>2011-12-13T02:27:00Z</published><updated>2011-12-13T02:27:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/13/2285682.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/12/13/2285682.html"/><content type="html">&lt;p&gt;常规的Objective-c的声明范例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;@interface&lt;/span&gt; Sample:NSObject&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@private&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID;&lt;br /&gt;}&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Done;&lt;br /&gt;+ (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Finish;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;声明的成员变量的位置在*.h上；&lt;br /&gt;&lt;br /&gt;现在之所以在这里提及成员变量的声明问题，在于和XCode版本有关&lt;br /&gt;在雪豹上的Xcode是4.0.1版本，编写上述代码完全如上。&lt;br /&gt;&lt;br /&gt;在狮子上的Xcode是4.2.x版本，编写上述代码既可以像上面一样，还能这么编写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;.h文件：&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;@interface&lt;/span&gt; Sample:NSObject&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Done;&lt;br /&gt;+ (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Finish;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;.m文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;@implementation&lt;/span&gt; Sample&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@private&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Done&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)Finish&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;p&gt;如果Xcode4.0.1版本编译上面的代码会出现如下错误：&lt;br /&gt;LLVM GCC 4.2 ERROR:Conflicting instance variable name 'int ID'&lt;br /&gt;或&lt;br /&gt;LLVM GCC 4.2 ERROR:Inconsistent instance variable specification&lt;br /&gt;&lt;br /&gt;从这些错误信息来说，应该是编译器的处理上引起的。在Xcode4.2.x上默认编译器版本Apple LLVM compiler 3.0&lt;br /&gt;&lt;br /&gt;既然如此，那我在Xcode4.0.1上面选择了LLVM compiler 2.0调试编译，通过了&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;1、建议使用标准的代码书写，如&amp;ldquo;常规的Objective-c的声明范例&amp;rdquo;，好处在于各个编译器通用&lt;br /&gt;2、&lt;br /&gt;Xcode 4.0.1 默认编译器 LLVM GCC 4.2&lt;br /&gt;Xcode 4.2.x 默认编译器 Apple LLVM compiler 3.0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2285682.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/12/13/2285682.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/11/29/2267919.html</id><title type="text">决定权在哪？</title><summary type="text">独裁~民主~~~</summary><published>2011-11-29T09:38:00Z</published><updated>2011-11-29T09:38:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/11/29/2267919.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/11/29/2267919.html"/><content type="html">&lt;p&gt;允许确认前修改&lt;br /&gt;&lt;br /&gt;允许确认前删除&lt;br /&gt;&lt;br /&gt;但不允许确认后修改~&lt;br /&gt;&lt;br /&gt;这就是决定权&lt;br /&gt;&lt;br /&gt;我的决定权&lt;br /&gt;&lt;br /&gt;不需要民主，只需要确认&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2267919.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/11/29/2267919.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/GoGoagg/archive/2011/11/28/2266289.html</id><title type="text">架构师的故事</title><summary type="text">架构师的故事</summary><published>2011-11-28T07:39:00Z</published><updated>2011-11-28T07:39:00Z</updated><author><name>西就东城</name><uri>http://www.cnblogs.com/GoGoagg/</uri></author><link rel="alternate" href="http://www.cnblogs.com/GoGoagg/archive/2011/11/28/2266289.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/GoGoagg/archive/2011/11/28/2266289.html"/><content type="html">&lt;p&gt;有这么一个架构师的故事：&lt;br /&gt;忘了故事具体来源，但内容是这样的，这个架构师为某大型系统做了详细的需求分析，使用工具为此定义一系列的类、接口、协议等等，然后交付给程序员各自编写、调试，联合组装......&lt;br /&gt;&lt;br /&gt;不知道该架构师使用了什么工具，什么方式来协调接口和调用问题，唯一知道的：其定义的接口和类都有详细的名字和描述，只需要初级程序员实现单个的功能。&lt;br /&gt;&lt;br /&gt;这就是架构师的功底。&lt;br /&gt;&lt;br /&gt;能力：&lt;br /&gt;1、需求分析能力，考虑一定扩展性和复合性&lt;br /&gt;2、程序模块化编写能力，由此才能设计详细的类/函数参数&lt;br /&gt;3、联调组装能力&lt;br /&gt;4、文档编写能力&lt;br /&gt;&lt;br /&gt;如果说这个架构师为满分，我能得到几分？&lt;br /&gt;个人认为分值如下：｛35，18，22，25｝&lt;br /&gt;我的能力：10~15，15，10，15，合计起来｛50~55｝&lt;br /&gt;哈哈，还没有及格哦{由于项目的规模问题，在故事中的那个系统，我估计能在30分就不错了}&lt;br /&gt;&lt;br /&gt;我的期望分值：75；&lt;br /&gt;在需求分析能力提高到20分，联通组装能力15分，文档编写能力20&lt;br /&gt;&lt;br /&gt;建议：把以前做的项目再次重构和实践&lt;/p&gt;&lt;img src="http://www.cnblogs.com/GoGoagg/aggbug/2266289.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/GoGoagg/archive/2011/11/28/2266289.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
