﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-CG@CPPBLOG</title><link>http://www.cppblog.com/cuigang/</link><description>/*=========================================*/</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:06:20 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:06:20 GMT</pubDate><ttl>60</ttl><item><title>用OBJC编程 9 - Conventions</title><link>http://www.cppblog.com/cuigang/archive/2013/11/23/204397.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sat, 23 Nov 2013 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/23/204397.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204397.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/23/204397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204397.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204397.html</trackback:ping><description><![CDATA[<div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 9 - Conventions</span></div><br /><ul><li><span style="font-family: Courier; font-size: 10pt;">有些名字在你的app里必须唯一</span></li><li><span style="font-family: Courier; font-size: 10pt;">类名必须唯一，因此请使用前缀，建议使用三个字母的前缀，避免和Cocoa框架冲突</span><span style="font-family: Courier; font-size: 10pt;">，类名使用名词</span></li><li><span style="font-family: Courier; font-size: 10pt;">方法名不要前缀，以小写字母开始，多个参数时，其它参数要有参数名。第一个单词指明方法的效果，或者一个行为等等。</span></li><li><span style="font-family: Courier; font-size: 10pt;">如果方法参数包括error，它应该是最后一个参数，如果参数包括一个block，它应该在最后，不应该有多个block参数。方法名长度要适中。</span></li><li><span style="font-family: Courier; font-size: 10pt;">避免缩写</span></li><li><span style="font-family: Courier; font-size: 10pt;">分类里的方法名加上前缀，避免冲突。</span></li><li><span style="font-family: Courier; font-size: 10pt;">局部变量应该是唯一的。</span></li><li><span style="font-family: Courier; font-size: 10pt;">访问器的名称要符合惯例。否则在KVC时可能不能工作。</span></li><li><span style="font-family: Courier; font-size: 10pt;">工厂方法名应该以类名开始（或者父类的类名）</span></li></ul><img src ="http://www.cppblog.com/cuigang/aggbug/204397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-23 11:33 <a href="http://www.cppblog.com/cuigang/archive/2013/11/23/204397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 8 - Dealing with Errors</title><link>http://www.cppblog.com/cuigang/archive/2013/11/23/204396.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sat, 23 Nov 2013 03:14:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/23/204396.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204396.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/23/204396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204396.html</trackback:ping><description><![CDATA[<div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 8 - Dealing with Errors</span></div><br /><span style="font-family: Courier; font-size: 10pt;">使用NSError，</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">委托方法会产生Error</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)connection:(NSURLConnection&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)connection&nbsp;didFailWithError:(NSError&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)error;<br /></span></div><span style="font-family: Courier; font-size: 10pt;">NSError包括错误码，</span><span style="font-family: Courier; font-size: 10pt;">错误业务领域domain和描述。为保证每个错误码唯一，使用了domain，NSURLConnection的domain是NSURLErrorDomain</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">通过引用参数传递Error</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(BOOL)WriteToURL:(NSURL&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)aURL&nbsp;option:(NSDataWritingOptions)mask&nbsp;error:(NSError</span><span style="color: #000000; font-family: Courier;">**</span><span style="color: #000000; font-family: Courier;">)&nbsp;errorPtr;<br /></span><span style="color: #808080; font-family: Courier;">////////////////////////</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #808080; "><br /></span><span style="color: #000000; font-family: Courier;">NSError&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">anyError;<br /></span><span style="color: #000000; font-family: Courier;">BOOL&nbsp;sucess&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[receivedData&nbsp;writeToURL:someLocalFileURL&nbsp;option:</span><span style="color: #000000; font-family: Courier;">0</span><span style="color: #000000; font-family: Courier;">&nbsp;error:</span><span style="color: #000000; font-family: Courier;">&amp;</span><span style="color: #000000; font-family: Courier;">anyError];<br /></span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #000000; font-family: Courier;">!</span><span style="color: #000000; font-family: Courier;">success){<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Write&nbsp;failed&nbsp;with&nbsp;error:&nbsp;%@</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;anyError);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">present&nbsp;error&nbsp;to&nbsp;user</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;如果writeToURL发生错误，返回NO，并且更新anyError<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;如果你对error不感兴趣，可以传递NULL</span></div><br /><span style="font-family: Courier; font-size: 10pt;">产生你自己的error</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">domain&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">com.MyCompany.MyApplication.ErrorDomain</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">;<br /></span><span style="color: #000000; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">desc&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;NSLocalizedString(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Unable&nbsp;to,,,</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;</span><span style="color: #000000; font-family: Courier;">@""</span><span style="color: #000000; font-family: Courier;">);<br /></span><span style="color: #000000; font-family: Courier;">NSDictionary&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">userInfo&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;@{NSLocalizedDescriptionKey&nbsp;:&nbsp;desc};<br /><br /></span><span style="color: #000000; font-family: Courier;">NSError&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">error&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[NSError&nbsp;errorWithDomain:domain&nbsp;code:</span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">101</span><span style="color: #000000; font-family: Courier;">&nbsp;userInfo:userInfo];<br /></span><span style="color: #808080; font-family: Courier;">/////////////////////</span><span style="color: #008000; font-family: Courier;">/</span><span style="color: #808080; "><br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(BOOL)&nbsp;doSomethingThatMayGenerateAnError:(NSError&nbsp;</span><span style="color: #000000; font-family: Courier;">**</span><span style="color: #000000; font-family: Courier;">)errorPtr;<br /><br /></span><span style="color: #808080; font-family: Courier;">//////////////////<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(BOOL)doSomethingThatMayGenerateAnError:(NSError&nbsp;</span><span style="color: #000000; font-family: Courier;">**</span><span style="color: #000000; font-family: Courier;">)errorPtr{<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;error&nbsp;occurred</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(errorPtr){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">errorPtr&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[NSError&nbsp;errorWithDomain:,,,&nbsp;&nbsp;code:,,,&nbsp;userInfo:,,,];<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;NO;<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">使用异常</span><br /><span style="font-family: Courier; font-size: 10pt;">OBJC像其他语言一样支持异常，NSException和NSError一样是一个对象</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@try{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;可能导致异常</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@catch&nbsp;(NSException&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">exception){<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;处理异常</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@finally{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;清理，处理无异常情况</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/cuigang/aggbug/204396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-23 11:14 <a href="http://www.cppblog.com/cuigang/archive/2013/11/23/204396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 7 - Working with Blocks</title><link>http://www.cppblog.com/cuigang/archive/2013/11/21/204370.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Thu, 21 Nov 2013 11:20:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/21/204370.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204370.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/21/204370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204370.html</trackback:ping><description><![CDATA[<span style="font-family: Courier; font-size: 10pt;"> </span><div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 7 - Working with Blocks</span></div><br /><span style="font-family: Courier; font-size: 10pt;">Block 是语言级别的特性。它是一个OBJC的对象，可以被加入容器如NSArray或NSDictionary。它可以捕获所处作用域的数值，非常类似其它语言的closure或者lambda。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">语法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">^</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">This&nbsp;is&nbsp;a&nbsp;block</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">);<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以像函数指针那样声明一个变量来持有这个block</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">^</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">simpleBlock)(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">);<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">simpleBlock&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">^</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">This&nbsp;is&nbsp;a&nbsp;block</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">);<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">};&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;注意这里有一个分号</span></div><br /><span style="font-family: Courier; font-size: 10pt;">也可以这样写</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">simpleBlock)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">This&nbsp;is&nbsp;a&nbsp;block</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">);<br /></span><span style="color: #000000; font-family: Courier;">};</span></div><br /><span style="font-family: Courier; font-size: 10pt;">调用这个block</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">simpleBlock();</span></div><br /><span style="font-family: Courier; font-size: 10pt;">带上参数和返回值</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">^</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;firstValue,&nbsp;</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;secondValue){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;firstValue</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">secondValue;<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;,,,,,,,,,,,</span><span style="color: #008000; "><br /></span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">multiplyTwoValues)(</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">,&nbsp;</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">)&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;firstValue,&nbsp;</span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;secondValue)&nbsp;{&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;返回值类型可以省略</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;firstValue</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">secondValue;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /></span><span style="color: #0000ff; font-family: Courier;">double</span><span style="color: #000000; font-family: Courier;">&nbsp;result&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;multiplyTwoValues(</span><span style="color: #000000; font-family: Courier;">2</span><span style="color: #000000; font-family: Courier;">,</span><span style="color: #000000; font-family: Courier;">4</span><span style="color: #000000; font-family: Courier;">);<br /></span><span style="color: #000000; font-family: Courier;">NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">The&nbsp;result&nbsp;is&nbsp;%f</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;result);</span></div><br /><span style="font-family: Courier; font-size: 10pt;">捕获Enclosing Scope内的值</span><span style="font-family: Courier; font-size: 10pt;">，一旦捕获，这个值就不会变化，即便后续改变这个值</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)testMethod{<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">int</span><span style="color: #000000; font-family: Courier;">&nbsp;anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">42</span><span style="color: #000000; font-family: Courier;">;<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">testBlock)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Integer&nbsp;is:&nbsp;%i</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;anInteger);<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">84</span><span style="color: #000000; font-family: Courier;">;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;testBlock(); // 仍然输出42<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span></div><br /><span style="font-family: Courier; font-size: 10pt;">使用__block</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">__block&nbsp;</span><span style="color: #0000ff; font-family: Courier;">int</span><span style="color: #000000; font-family: Courier;">&nbsp;anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">42</span><span style="color: #000000; font-family: Courier;">;<br /></span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">testBlock)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Integer&nbsp;is:&nbsp;%i</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;anInteger);<br /></span><span style="color: #000000; font-family: Courier;">};<br /></span><span style="color: #000000; font-family: Courier;">anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">84</span><span style="color: #000000; font-family: Courier;">:<br /></span><span style="color: #000000; font-family: Courier;">testBlock();&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;output&nbsp;84;<br /><br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;,,,,,,,,,,,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">_block&nbsp;</span><span style="color: #0000ff; font-family: Courier;">int</span><span style="color: #000000; font-family: Courier;">&nbsp;anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">42</span><span style="color: #000000; font-family: Courier;">;<br /></span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">testBlock)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Integer&nbsp;is:&nbsp;%i</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;anInteger);&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;output&nbsp;42</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;anInteger&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">100</span><span style="color: #000000; font-family: Courier;">;<br /></span><span style="color: #000000; font-family: Courier;">};<br /><br /></span><span style="color: #000000; font-family: Courier;">testBlock();<br /></span><span style="color: #000000; font-family: Courier;">NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Value&nbsp;of&nbsp;original&nbsp;variable&nbsp;is&nbsp;now:&nbsp;%i</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;anInteger);&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;output&nbsp;100;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">通过参数传递Block，例如实现一个回调</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(IBAction)fetchRemoveInformation:(id)sender{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;[self&nbsp;showProgressIndicator];<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;XYZWebTask&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">task&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;[task&nbsp;beginTaskWithCallbackBlock:</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;hideProgressIndicator];<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}];<br /></span><span style="color: #000000; font-family: Courier;">}<br /><br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;beginTaskWithCallbackBlock&nbsp;的定义是这样的</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)beginTaskWithCallbackBlock:(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">))callbackBlock{<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;callbackBlock();<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">最佳实践是将block作为最后一个参数，这样便于阅读。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">也可以使用typedef简化语法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">typedef&nbsp;</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">XYZSimpleBlock)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">);<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,,,,,,,,,,,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">XYZSimpleBlock&nbsp;anotherBlock&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{&nbsp;</span><span style="color: #008000; font-family: Courier;">/*</span><span style="color: #008000; font-family: Courier;">,,,</span><span style="color: #008000; font-family: Courier;">*/</span><span style="color: #000000; font-family: Courier;">&nbsp;};<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,,,,,,,,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)beginFetchWithCallbackBlock:(XYZSimpleBlock)callbackBlock{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;callbackBlock();<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以将block作为属性</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@interface&nbsp;XYZObject&nbsp;:&nbsp;NSObject<br /></span><span style="color: #000000; font-family: Courier;">@property&nbsp;(copy)&nbsp;</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">blockProperty)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">);&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;必须使用copy</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">@end<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,,,,,,,,,,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">self.blockProperty&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{&nbsp;</span><span style="color: #008000; font-family: Courier;">/*</span><span style="color: #008000; font-family: Courier;">&nbsp;,,,&nbsp;</span><span style="color: #008000; font-family: Courier;">*/</span><span style="color: #000000; font-family: Courier;">&nbsp;};<br /></span><span style="color: #000000; font-family: Courier;">self.blockProperty();<br /></span></div><br /><span style="font-family: Courier; font-size: 10pt;">避免强引用循环</span><br /><span style="font-family: Courier; font-size: 10pt;">在block里捕获self，诸如在一个callback block里，会引入内存管理问题。block会会维护一个捕获对象的强引用，包括self</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@interface&nbsp;XYZBlockKeeper&nbsp;:&nbsp;NSObject<br /></span><span style="color: #000000; font-family: Courier;">@property&nbsp;(copy)&nbsp;</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">&nbsp;(</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">block)(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">);<br /></span><span style="color: #000000; font-family: Courier;">@end<br /></span><span style="color: #808080; font-family: Courier;">////////////////////////<br /></span><span style="color: #000000; font-family: Courier;">@implementation&nbsp;XYZBlockKeeper<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)configureBlock{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;self.block&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;doSomething];&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;捕获了一个self的强引用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;建立了一个强引用循环</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">上述代码会产生一个编译警告，为了避免这种情况，最佳实践是捕获一个self的弱引用</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)configureBlock{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;XYZBlockKeeper&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">&nbsp;__weak&nbsp;weakSelf&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;self;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;self.block&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier;">^</span><span style="color: #000000; font-family: Courier;">&nbsp;{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[weakSelf&nbsp;doSomething];<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;};<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">block可以简化枚举（略）</span><br /><span style="font-family: Courier; font-size: 10pt;">block可以简化并发任务（略）</span><br /><br /><br /><br /><img src ="http://www.cppblog.com/cuigang/aggbug/204370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-21 19:20 <a href="http://www.cppblog.com/cuigang/archive/2013/11/21/204370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 6 - Value and Collections</title><link>http://www.cppblog.com/cuigang/archive/2013/11/21/204367.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Thu, 21 Nov 2013 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/21/204367.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204367.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/21/204367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204367.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用OBJC编程 6 - Value and CollectionsOBJC里可以用基本的C原生类型，也定义了一些扩展的原生类型。BOOL类型，它的值是YES和NO，YES等于true等于1。NO等于false等于0。Cocoa定义了特殊的原生类型，如NSInteger和CGFloat。像NSInteger和NSUInteger，依赖于平台，在32位系统下是32位的，在64位下是64位的。通过API...&nbsp;&nbsp;<a href='http://www.cppblog.com/cuigang/archive/2013/11/21/204367.html'>阅读全文</a><img src ="http://www.cppblog.com/cuigang/aggbug/204367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-21 17:34 <a href="http://www.cppblog.com/cuigang/archive/2013/11/21/204367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 5 - Working with Protocols</title><link>http://www.cppblog.com/cuigang/archive/2013/11/21/204364.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Thu, 21 Nov 2013 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/21/204364.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204364.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/21/204364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204364.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204364.html</trackback:ping><description><![CDATA[<div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 5 - Working with Protocols</span></div><br /><span style="font-family: Courier; font-size: 10pt;">协议定义了交互的消息</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@protocol&nbsp;XYZPieChartViewDataSource<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSUInteger)&nbsp;numberOfSegments;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(CGFloat)&nbsp;&nbsp;&nbsp;&nbsp;sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)&nbsp;titleForSegmentAtIndex:(NSUInteger)segmentIndex;<br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">数据源作为View的一个属性，只要是符合协议的对象就可以，所以类型是id。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;XYZPieChartView&nbsp;:&nbsp;UIView<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;(weak)&nbsp;id&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&lt;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">XYZPieChartViewDataSource</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&gt;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;dataSource;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end</span></div><span style="font-family: Courier; font-size: 10pt;">委托和数据源属性通常声明为weak，以避免强引用循环。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">设置属性为一个不符合协议的对象，将会引起一个编译时警告。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">可选方法，使用@optional 和 @required</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; font-family: Courier;">@protocol&nbsp;XYZPieChartViewDataSource<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSUInteger)&nbsp;numberOfSegments;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(CGFloat)&nbsp;&nbsp;&nbsp;&nbsp;sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;<br /></span><span style="color: #000000; font-family: Courier;">@optional<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)&nbsp;titleForSegmentAtIndex:(NSUInteger)segmentIndex;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(BOOL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldExplodeSegmentAtIndex:(NSUInteger)segementIndex;<br /></span><span style="color: #000000; font-family: Courier;">@required<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(UIColor&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)&nbsp;&nbsp;colorForSegmentAtIndex:(NSUInteger)segementIndex;<br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">运行时检查可选方法</span><br /><span style="font-family: Courier; font-size: 10pt;">如果一个方法是可选的，那么在调用前应该检查它是否实现。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">thisSegmentTitle; // Local object variables are automatically initialized to nil<br /></span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">([self.dataSource&nbsp;respondsToSelector:@selector(titleForSegmentAtIndex:)]){<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;thisSegmentTitle&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[self.dataSource&nbsp;titleForSegmentAtIndex:index];<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">respondsToSelector: 方法用了一个selector，@selector。</span><br /><span style="font-family: Courier; font-size: 10pt;">如上定义一个符合协议的id类型，调用respondsToSelector，会产生一个编译时错误，解决方案是声明对象符合NSObject协议</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">从协议继承</span><br /><span style="font-family: Courier; font-size: 10pt;">最佳实践是，你的协议依从NSObject协议</span><span style="font-family: Courier; font-size: 10pt;">。NSObject对象依从NSObject协议。</span><br /><span style="font-family: Courier; font-size: 10pt;">一旦你的协议依从NSObject协议，那么依从你协议的任何对象都必须实现NSObject协议的方法，但因为它们应该是NSObject的子类，你就不必自己实现这些NSObject的方法。依从NSObject协议非常有用。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@protocol&nbsp;MyProtocol&nbsp;</span><span style="color: #000000; font-family: Courier;">&lt;</span><span style="color: #000000; font-family: Courier;">NSObject</span><span style="color: #000000; font-family: Courier;">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">comform 一个协议</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;MyClass&nbsp;:&nbsp;NSObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&lt;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">MyProtocol,&nbsp;AnotherProtocol</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end</span></div><span style="font-family: Courier; font-size: 10pt;">如果一个类声明了大量的协议，意味着代码需要重构成多个小的类。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">一旦声明依从某个协议，就必须实现所有的required方法，和需要的optional方法，否则编译器会给出警告。方法的签名必须相同。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">Cocoa 和 Cocoa Touch 定义了大量的protocol</span><br /><ul><li><span style="font-family: Courier; font-size: 10pt;">view的数据源协议</span></li><li><span style="font-family: Courier; font-size: 10pt;">view的委托协议delegate</span></li><li><span style="font-family: Courier; font-size: 10pt;">一些类似的类，但是无继承关系，比如NSArray和NSDictionary依从NSCoding协议</span></li><li><span style="font-family: Courier; font-size: 10pt;">一些OBJC语言级特性，也依赖协议，如一个容器需要依从NSFastEnumeration协议才能使用快速枚举fast enumeration；copy的属性依从NSCopying协议，否则会得到一个运行时异常。</span></li></ul><p><span style="font-family: Courier; font-size: 10pt;">为匿名使用协议</span></p><p><span style="font-family: Courier; font-size: 10pt;">有时候，一个框架的开发者为了向使用者隐藏一个类，只把它的接口通过协议暴露</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">id&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&lt;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">XYZFrameworkUtility</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&gt;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;utility&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[frameworkObject&nbsp;anonymousUtility];<br /></span></div><br /><span style="font-family: Courier; font-size: 10pt;">例如NSFetcheResultsController</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">NSInteger&nbsp;sectionNumber&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">id&nbsp;</span><span style="color: #000000; font-family: Courier;">&lt;</span><span style="color: #000000; font-family: Courier;">NSFetchedResultSectionInfo</span><span style="color: #000000; font-family: Courier;">&gt;</span><span style="color: #000000; font-family: Courier;">&nbsp;sectionInfo&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.fetchedResultsController.sections&nbsp;objectAtIndex:sectionNumber];<br /></span><span style="color: #000000; font-family: Courier;">NSInteger&nbsp;numberOfRowsInSection&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[sectionInfo&nbsp;numberOfObjects];</span></div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/cuigang/aggbug/204364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-21 09:32 <a href="http://www.cppblog.com/cuigang/archive/2013/11/21/204364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 4 - Customizing Existing Classes</title><link>http://www.cppblog.com/cuigang/archive/2013/11/20/204359.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 20 Nov 2013 10:55:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/20/204359.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204359.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/20/204359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204359.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204359.html</trackback:ping><description><![CDATA[<div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 4 - Customizing Existing Classes</span></div><br /><span style="font-family: Courier; font-size: 10pt;">通过Category为类增加方法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">#import&nbsp;</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">XYZPerson.h</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">@interface&nbsp;XYZPerson&nbsp;(XYZPersonNameDisplayAddtions)<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)lastNameFirstNameString;<br /></span><span style="color: #000000; font-family: Courier;">@end<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;----------------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">#import&nbsp;</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">XYZPerson+XYZPersonNameDisplayAddtions.h</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">@implementation&nbsp;XYZPerson&nbsp;(XYZPersonNameDisplayAddtions)<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">&nbsp;(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)lastNameFirstNameString{<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;[NSString&nbsp;stringWithFormat:</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">%@&nbsp;%@</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;self.lastName,&nbsp;self.firstName];<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@end<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">-------------------------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">#import&nbsp;</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">XYZPerson+XYZPersonNameDisplayAddtions.h</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier;">@implementation&nbsp;SomeObject<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)&nbsp;someMethod{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;XYZPerson&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">person&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[[XYZPerson&nbsp;alloc]&nbsp;initWithFirstName:</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">John</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;lastName:</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">Doe</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">];<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">The&nbsp;people&nbsp;is&nbsp;%@</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;[person&nbsp;lastNameFirstNameString]);<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">Category 可以增加任何的实例方法和类方法，但是通常不适合增加Property，虽然语法上可以声明一个Property，但不能通过Category增加一个实例变量。这意味着不能synthesize任何实例变量， 也没有存取方法。 你可以写自己的accessor，但是不能keep track property，它们存储在原始的类里。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">避免名字冲突</span><br /><span style="font-family: Courier; font-size: 10pt;">Category 的新增方法可能会导致名字冲突，在运行时可能会出现未知的行为，为了避免这种情况，需要增加前缀</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@interface&nbsp;NSSortDescriptor&nbsp;(XYZAdditions)<br /></span><span style="color: #000000; font-family: Courier;">+</span><span style="color: #000000; font-family: Courier;">&nbsp;(id)xyz_sortDescriptorWithKey:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)key&nbsp;ascending:(BOOL)ascending;<br /></span><span style="color: #000000; font-family: Courier;">@end<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;&nbsp;------&nbsp;use&nbsp;it&nbsp;-------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">NSSortDescriptor&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">descriptor&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[NSSortDescriptor&nbsp;xyz_sortDescriptorWithKey:</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">name</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">&nbsp;ascending:YES];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">类扩展类似分类，但只能用于编译时有源码情况，并且必须写在实现文件里，因此不能通过这个为框架类扩展。扩展语法类似分类</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;ClassName&nbsp;()<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp; id _someCustomInstanceVariable;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;NSObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">extraProperty;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end</span></div><span style="font-family: Courier; font-size: 10pt;">也叫匿名分类。不像分类那样，扩展可以增加属性和实例变量。编译器会自动synthesize accessor方法。如果你增加方法，必须实现在主要的@implementation</span><span style="font-family: Courier; font-size: 10pt;">代码块里。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">可以用扩展来声明私有属性和方法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">@interface&nbsp;XYZPerson:NSObject<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@proerty&nbsp;(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">readonly</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">uniqueIdentifier;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)assignUniqueIdentifier;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@end<br /><br /></span><span style="color: #808080; font-size: 10pt; font-family: Courier;">///</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;---------------------</span><span style="color: #808080; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@interface&nbsp;XYZPerson&nbsp;()<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;(readwrite)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">uniqueIdentifier;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@end<br /><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@implementation&nbsp;XYZPerson<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;,,,</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@end</span></div><span style="font-family: Courier; font-size: 10pt;">像上面那样重复声明uniqueIdentifier为readwrite，每一个运行时的XYZPerson对象都将存在一个setter。</span><br /><span style="font-family: Courier; font-size: 10pt;">任何访问私有方法，或者set一个readonly属性的行为，编译器都会产生错误，但是可以通过动态运行时特性避免编译器错误，诸如调用NSObject的performSelector方法。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">如果你打算构建私有方法或属性，你可以声明一个分离的头文件来声明扩展，诸如XYZPerson.h和XYZPersonPrivate.h</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">分类和扩展并不是定制一个类的唯一途径，也不是最好方法，要考虑可否使用子类化或者委托的方法来实现。</span><br /><br /><br /><img src ="http://www.cppblog.com/cuigang/aggbug/204359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-20 18:55 <a href="http://www.cppblog.com/cuigang/archive/2013/11/20/204359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 3 -Encapsulating Data</title><link>http://www.cppblog.com/cuigang/archive/2013/11/20/204356.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Wed, 20 Nov 2013 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/20/204356.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204356.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/20/204356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204356.html</trackback:ping><description><![CDATA[<span style="font-family: Courier; font-size: 10pt;"> </span><div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程3-Encapsulating Data</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;XYZPerson&nbsp;:NSObject<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">firstName;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">lastName;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end<br /><br /></span><span style="color: #808080; font-family: Courier; font-size: 10pt;">///</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;============</span><span style="color: #808080; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">firstName&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[somePerson&nbsp;firstName];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">[somePerson&nbsp;setFirstName:</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">Johnny</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">限定属性为只读，也可限定为readwrite，但这不必，因为缺省如是。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">readonly</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">fullname;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以指定属性的访问器名称，多个限定词如下格式</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@property&nbsp;(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">readonly</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">,&nbsp;getter</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">isFinished)&nbsp;BOOL&nbsp;finished;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">使用点语法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">firstName&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;somePerson.firstName;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;NSString&nbsp;*firstName&nbsp;=&nbsp;[somePerson&nbsp;firstName];</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">somePerson.firstName&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">Johnny</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;[somePerson&nbsp;setFirstName:@"Johnny"];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">大多数属性有一个实例变量。</span><br /><span style="font-family: Courier; font-size: 10pt;">缺省的读写属性会由编译器自动生成一个实例变量，以下划线开始，如_firstName;</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)&nbsp;someMethod{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">myString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">An&nbsp;interesting&nbsp;string</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;_someString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;myString;<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;self.someString&nbsp;=&nbsp;myString;<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;or<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;[self&nbsp;setSomeString:myString];</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以指定实例变量的名字</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@implementation&nbsp;YourClass<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@synthesize&nbsp;propertyName&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;instanceVariableName;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;----&nbsp;for&nbsp;example</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@synthesize&nbsp;firstName&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;ivar_firstName;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">如果你不指定名字，实例变量则和属性同名，前面没有下划线</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@synthesize&nbsp;firstName;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">如果你并不想提供数值给其它对象，你不必声明一个属性而使用一个实例变量</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@interface&nbsp;SomeClass:&nbsp;NSObject{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">_myNonPropertyInstanceVariable;<br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #000000; font-family: Courier;">@end<br /><br /></span><span style="color: #000000; font-family: Courier;">@implementation&nbsp;SomeClass{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">_anotherCustomInstanceVariable;<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">在初始化方法里访问实例变量</span><br /><span style="font-family: Courier; font-size: 10pt;">Setter方法会有附加效果。它们可能触发KVC通知，或者完成你定制的方法。</span><br /><span style="font-family: Courier; font-size: 10pt;">你应该在初始化方法里直接访问实例变量，因为对象还没有初始化完成。甚至你不应该提供定制的访问器方法给你的类提供附加效果。这样将来的子类可以很好的override这个行为。</span><br /><span style="font-family: Courier; font-size: 10pt;">一个典型的init方法如下</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(id)init{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;self&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[super&nbsp;init];<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(self){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;initialize&nbsp;instance&nbsp;variables&nbsp;here</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;self;<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以指定初始化方法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(id)initWithFirstName:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)aFirstName&nbsp;lastName:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)aLastName{<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;self&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[super&nbsp;init];<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(self){<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;_firstName&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;aFirstName;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;_lastName&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;aLastName;<br /></span><span style="color: #000000; font-family: Courier;">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;self;<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">可以指定访问方法</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@property&nbsp;(</span><span style="color: #0000ff; font-family: Courier;">readonly</span><span style="color: #000000; font-family: Courier;">)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">fullName;<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;-------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(NSString&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">)fullName{<br />&nbsp;</span><span style="color: #0000ff; font-family: Courier;">return</span><span style="color: #000000; font-family: Courier;">&nbsp;[NSString&nbsp;stringWithFormat:</span><span style="color: #000000; font-family: Courier;">@"</span><span style="color: #000000; font-family: Courier;">%@&nbsp;%@</span><span style="color: #000000; font-family: Courier;">"</span><span style="color: #000000; font-family: Courier;">,&nbsp;self.firstName,&nbsp;self.lastName];<br /></span><span style="color: #000000; font-family: Courier;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">如果你需要在访问器里访问实例变量，那应该直接访问。例子里延迟初始化一个对象，lazy accessor。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;(XYZObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)someImportantObject&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">if</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">!</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">_someImportantObject){<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;_someImportantObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[[XYZObject&nbsp;alloc]&nbsp;init];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">return</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;_someImportantObject;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">编译器会自动synthesize一个实例变量。至少一个访问方法。如果你为readwrite属性实现了getter和setter，或者为readonly实现了getter。编译器认为你想控制属性实现，也不会再为你自动生成一个实例变量。因此，如果你仍然需要一个实例变量，你需要手动synthesize</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@synthesize&nbsp;property&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;_property;</span></div><br /><span style="font-family: Courier; font-size: 10pt;">属性缺省是原子性的。atomic</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">@interface&nbsp;XYZObject&nbsp;:&nbsp;NSObject<br /></span><span style="color: #000000; font-family: Courier;">@property&nbsp;NSObject&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">implicitAtomObject;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;缺省是atomic</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">@property&nbsp;(atomic)&nbsp;NSObject&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">explicitAtomicObject;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;指明atomic</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">@end</span></div><span style="font-size: 10pt; font-family: Courier;">缺省访问器已经解决了多线程并发的问题。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">如果你定制了一个atomic, readwrite的属性的setter，而让编译器自动生成getter，将会得到一个编译时警告。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">你可以声明nonatomic属性，因为不需要guarantee，处理并发，因此它的访问器比atomic属性更快。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">属性的原子性并不意味着对象是线程安全的。例如firstName和LastName。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">管理对象的生命周期，对象是通过指针来访问，内存是动态申请的，指针变量的生命周期不代表对象的证明周期。strong reference意味着对象和另一个对象的生命周期一样长。</span><br /><span style="font-size: 10pt; font-family: Courier;">属性缺省是强引用，可以指定weak。本地变量都是强引用，如果你不希望维护一个强引用，可以使用__weak</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;(weak)&nbsp;id&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">delegate</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;---------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;__weak&nbsp;weakVariable;</span></div><br /><span style="font-size: 10pt; font-family: Courier;">弱引用会带来不安全的行为，因为变量可能会被置为nil。</span><br /><span style="font-size: 10pt; font-family: Courier;">一些Cocoa类不能声明为弱引用，包括NSTextView, NSFont, NSColorSpace等，如果你需要使用这些类的一个弱引用，你需要一个unsafe_unretained声明。</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;(unsafe_unretained)&nbsp;NSObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">unsafePropery;<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;__unsafe_unretained&nbsp;unsafeReference;</span></div><span style="font-size: 10pt; font-family: Courier;">unsafe引用类似weak引用，但当对象释放时，它不会被置为nil，因此你可能会持有一个悬挂指针，指向一个未知内存，向它发消息可能会导致崩溃。</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">copy属性</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">@interface&nbsp;XYZBadgeView&nbsp;:&nbsp;NSView<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">firstName;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@peoperty&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">lastName;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@end</span></div><br /><span style="font-size: 10pt; font-family: Courier;">如果你这样做</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSMutableString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">nameString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[NSMutableString&nbsp;stringWithString:</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">John</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">];<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">self.badgeView.firstName&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;nameString;<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;----</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">[nameString&nbsp;appendString:</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">ny</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">];</span></div><span style="font-size: 10pt; font-family: Courier;">这样firstName将指向一个NSMutableString，它的值可以改变了，你可以增加copy声明，避免这种情况</span><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">@interface&nbsp;XYZbadgeView&nbsp;:&nbsp;NSView<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;(copy)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">firstName;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@property&nbsp;(copy)&nbsp;NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">lastName;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@end<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;--------------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSMutableString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">nameString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[NSMutableString&nbsp;stringWithString:</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">John</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">];<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">self.badgeView.firstName&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;nameString;<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;----</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">[nameString&nbsp;appendString:</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">ny</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">];</span></div><span style="font-size: 10pt; font-family: Courier;">这样firstName仍然是&#8220;John&#8221;，不会发生变化</span><br /><br /><span style="font-size: 10pt; font-family: Courier;">一个被声明为copy的对象</span><span style="font-size: 10pt; font-family: Courier;">必须支持NSCopying协议</span><span style="font-size: 10pt; font-family: Courier;">。如果你要直接set一个copy属性的实例变量，例如在初始化方法里，一定要设置原始对象的copy</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">(id)initWithSomeOriginalString:(NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)aString{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;self&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[super&nbsp;init];<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">if</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">(self){<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_instanceVariableForCopyProperty&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[aString&nbsp;copy];<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;self;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">}</span></div><br /><br /><img src ="http://www.cppblog.com/cuigang/aggbug/204356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-20 16:49 <a href="http://www.cppblog.com/cuigang/archive/2013/11/20/204356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 2 - working with Objects</title><link>http://www.cppblog.com/cuigang/archive/2013/11/19/204339.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 19 Nov 2013 15:11:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/19/204339.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204339.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/19/204339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204339.html</trackback:ping><description><![CDATA[<div><span style="font-family: Courier; font-size: 10pt;">用OBJC编程 2 - working with Objects</span></div><br /><span style="font-family: Courier; font-size: 10pt;">发送和接收消息</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;XYZPerson&nbsp;:&nbsp;NSObject<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)&nbsp;sayHello;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end<br /><br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;implemetation</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@implementation&nbsp;XYZPerson<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)&nbsp;sayHello{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">Hello,&nbsp;world!</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">);<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;XYZPerson<br /><br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;-----</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">[somePerson&nbsp;sayHello];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">通过指针keep对象</span><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)myMethod{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">myString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;get&nbsp;a&nbsp;string&nbsp;from&nbsp;somewhere.</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">通过参数传递对象</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)saySomething:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)greeting;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;implementation</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)saySomething:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)greeting{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">%@</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">,&nbsp;greeting);&nbsp;&nbsp; // "%@",用来打印对象<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">通过返回值传递</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)magicString;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">implementation</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)magicString{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">stringToReturn&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;create&nbsp;string</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">return</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;stringToReturn;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;use&nbsp;it</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">magic&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[testString&nbsp;magicString];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">向自己发送消息</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@implementation&nbsp;XYZPerson<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)sayHello{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;[self&nbsp;saySomething:</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">Hello,&nbsp;world!</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)saySomething:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)greeting{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;NSLog(</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">%@</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">"</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">,&nbsp;greeting);<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">向父类发消息</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">@interface&nbsp;XYZShoutingPerson&nbsp;:&nbsp;XYZPerson<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end<br /></span><span style="color: #808080; font-family: Courier; font-size: 10pt;">/////////////////////<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@implementation&nbsp;XYZShoutingPerson<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">void</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)saySomething:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)greeting{<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">uppercaseGreeting&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[greeting&nbsp;uppercaseString];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;[super&nbsp;saySomething:uppercaseGreeting];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">@end</span></div><br /><span style="font-family: Courier; font-size: 10pt;">动态创建对象</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;NSObject提供一个类方法,&nbsp;id&nbsp;like&nbsp;(NSObject&nbsp;*)</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)alloc;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">-</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)init;<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">===============&nbsp;use&nbsp;it</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">NSObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">newObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[[NSObject&nbsp;alloc]&nbsp;init];</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;init可能返回一个和alloc不同的对象，因此最好嵌套使用alloc和init，不推荐如下使用</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">NSObjet&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">someObject&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">=</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;[NSObject&nbsp;alloc];<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">[someObject&nbsp;init];</span></div><br /><span style="font-family: Courier; font-size: 10pt;">初始化方法可以带参数</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(id)initWithInt:(</span><span style="color: #0000ff; font-family: Courier;">int</span><span style="color: #000000; font-family: Courier;">)value;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(id)initWithLong:(</span><span style="color: #0000ff; font-family: Courier;">long</span><span style="color: #000000; font-family: Courier;">)value;<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">------------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">magicNumber&nbsp;</span><span style="color: #000000; font-family: Courier;">=</span><span style="color: #000000; font-family: Courier;">&nbsp;[[NSNumber&nbsp;alloc]&nbsp;initWithInt:</span><span style="color: #000000; font-family: Courier;">42</span><span style="color: #000000; font-family: Courier;">];</span></div><br /><span style="font-size: 10pt; font-family: Courier;">类工厂方法提供了另一个选择</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt;">+</span><span style="color: #000000; font-size: 10pt;">(NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt;">*</span><span style="color: #000000; font-size: 10pt;">)numberWithInt:(</span><span style="color: #0000ff; font-size: 10pt;">int</span><span style="color: #000000; font-size: 10pt;">)value;<br /></span><span style="color: #000000; font-size: 10pt;">+</span><span style="color: #000000; font-size: 10pt;">(NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt;">*</span><span style="color: #000000; font-size: 10pt;">)numberWithLong:(</span><span style="color: #0000ff; font-size: 10pt;">long</span><span style="color: #000000; font-size: 10pt;">)value;<br /></span><span style="color: #008000; font-size: 10pt;">//</span><span style="color: #008000; font-size: 10pt;">------------------</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt;">*</span><span style="color: #000000; font-size: 10pt;">magicNumber&nbsp;</span><span style="color: #000000; font-size: 10pt;">=</span><span style="color: #000000; font-size: 10pt;">&nbsp;[NSNumber&nbsp;numberWithInt:</span><span style="color: #000000; font-size: 10pt;">42</span><span style="color: #000000; font-size: 10pt;">];</span></div><br /><span style="font-size: 10pt; font-family: Courier;">使用new来代替</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">XYZObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">object</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[XYZObject&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">];<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;is&nbsp;effectively&nbsp;the&nbsp;same&nbsp;as:</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">XYZObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">object</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[[XYZObject&nbsp;alloc]&nbsp;init];</span></div><br /><span style="font-size: 10pt; font-family: Courier;">通过字面量创建</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">someString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Hello,&nbsp;world!</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;is&nbsp;same&nbsp;as</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">someString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;[NSString&nbsp;stringWithCString:</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Hello,&nbsp;world!</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;encoding:NSUTF8StringEncoding];<br /><br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">=======</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">myBOOL&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;@YES;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">myFloat&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;@</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">3.14f</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">myInt&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;@</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">42</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">myLong&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;@</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">42L</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSNumber&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">myInt2&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;@(</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">84</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">2</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">);</span></div><br /><span style="font-size: 10pt; font-family: Courier;">OBJC 是一个动态语言</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;下面代码会产生运行时错误，因为NSString没有removeAllObjects方法</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">id&nbsp;someObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Hello,&nbsp;World!</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">[someObject&nbsp;removeAllObjects];<br /><br /></span><span style="color: #008000; font-size: 10pt; font-family: Courier;">//</span><span style="color: #008000; font-size: 10pt; font-family: Courier;">&nbsp;下面代码会产生编译时错误</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">NSString&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">someObject&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">@"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Hello,&nbsp;World!</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">"</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">[someObject&nbsp;removeAllObjects];</span><span style="color: #000000; font-size: 10pt;"><br /></span></div><br /><span style="font-family: Courier; font-size: 10pt;">比较对象</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;因为是指针，所以可以这样比较是否同一个对象</span><span style="color: #008000; "><br /></span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">if</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(firstPerson&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">==</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;secondPerson){<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;the&nbsp;same&nbsp;object</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}<br /></span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;如果要比较数据是否相同，使用isEqual</span><span style="color: #008000; "><br /></span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">if</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">([firstPerson&nbsp;isEqual:secondPerson])&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">&nbsp;is&nbsp;identical&nbsp;to&nbsp;second</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">}</span></div><br /><span style="font-family: Courier; font-size: 10pt;">使用nil</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;nil&nbsp;是一个对象指针，声明一个对象指针无需初始化，编译器会初始化它为nil</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">XYZPerson&nbsp;</span><span style="color: #000000; font-family: Courier;">*</span><span style="color: #000000; font-family: Courier;">somePerson;<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;------------</span><span style="color: #008000; "><br /></span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(somePerson&nbsp;</span><span style="color: #000000; font-family: Courier;">!=</span><span style="color: #000000; font-family: Courier;">&nbsp;nil){<br />&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;====</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}<br /></span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;or&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #0000ff; font-family: Courier;">if</span><span style="color: #000000; font-family: Courier;">(somePerson){<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-family: Courier;">//</span><span style="color: #008000; font-family: Courier;">&nbsp;===</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Courier;">}</span></div><img src ="http://www.cppblog.com/cuigang/aggbug/204339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-19 23:11 <a href="http://www.cppblog.com/cuigang/archive/2013/11/19/204339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OBJC编程 0-简介 &amp; .1 定义类</title><link>http://www.cppblog.com/cuigang/archive/2013/11/19/204145.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Tue, 19 Nov 2013 10:34:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/19/204145.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204145.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/19/204145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204145.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 10pt; font-family: Courier;"><span style="font-family: Courier; font-size: 10pt;">&lt;Programming with Objective-C&gt;-0-Introduction</span></strong></div><br /><span style="font-family: Courier; font-size: 10pt;">OBJC是OSX和IOS的主要编程语言，它是C的超集，提供了面向对象的特性和动态运行时类型信息。OBJC继承了C的语法，基本数据类型和流程控制，附加了定义类和方法的语法。也为动态类型绑定提供了语言级别的支持。</span><br /><br /><div><span style="font-family: Courier; font-size: 10pt;"><strong>&lt;Programming with Objective-C&gt;-1-Defining Classes</strong></span><span style="font-family: Courier; font-size: 14pt;"><br /></span><br /><span style="font-family: Courier; font-size: 10pt;">可变性决定值是否可以更改<br /></span><blockquote><span style="font-family: Courier; font-size: 10pt;">一些类定义对象是immutable的，意味着对象的内容不可被其它对象改变。NSString和NSNumber是immutable的</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">一些immutable类页游mutable版本。比如NSString的NSMutableString。</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">尽管NSString和NSMutableString是不同的类，它们有非常多的相似之处</span><br /></blockquote><br /><span style="font-family: Courier; font-size: 10pt;">从另一个类继承</span><br /><blockquote><span style="font-family: Courier; font-size: 10pt;">从另一个类继承，子类继承了父类所有的行为和属性。也可以定义自己的behavior和properties，或者override父类的behavior</span><br /><br /><span style="font-family: Courier; font-size: 10pt;">NSMutableString继承于NSString，因此拥有所有NSString的功能，也增加了append，insert，replace，delete substring等方法</span><br /></blockquote><span style="font-family: Courier; font-size: 12pt;"><br /></span><span style="font-family: Courier; font-size: 10pt;">根类提供基本功能</span><br /><blockquote><span style="font-family: Courier; font-size: 10pt;">如果你定义一个自己的类，应该至少继承于NSObject</span><br /></blockquote><strong style="font-size: 12pt;"><br /></strong><strong style="font-size: 10pt; font-family: Courier;">类的接口定义</strong><br style="font-size: 10pt; font-family: Courier;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">基本语法</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; font-family: Courier;">1</span>&nbsp;<span style="color: #000000; font-family: Courier;">@interface&nbsp;SimpleClass&nbsp;:&nbsp;NSObject<br /></span><span style="color: #008080; font-family: Courier;">2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; font-family: Courier;">3</span>&nbsp;<span style="color: #000000; font-family: Courier;">@end</span><span style="color: #000000; "><br /></span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">Properties控制访问一个对象的值</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@interface&nbsp;Person&nbsp;:&nbsp;NSObject<br /><br />@property&nbsp;NSString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">firstName;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;对象用指针</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">@property&nbsp;NSString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">lastName;<br />@property&nbsp;NSNumber&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">yearOfBirth;<br />@property&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;yearOfBirth_1;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;用基本类型</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />@end</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">Property属性指明数据的可访问性和存储情况</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@interface&nbsp;Person&nbsp;:&nbsp;NSObject<br />@property&nbsp;(</span><span style="color: #0000FF; ">readonly</span><span style="color: #000000; ">)&nbsp;NSString</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;firstName;<br />@property&nbsp;(</span><span style="color: #0000FF; ">readonly</span><span style="color: #000000; ">)&nbsp;NSString</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;lastName;<br />@end</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">方法定义</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)someMethod;</span></div><span style="font-family: Courier; font-size: 10pt;">前面的 - 号表示这是一个实例方法</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">方法可以带参数</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)someMethodWithValue:(SomeType)value;</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">可以有多个参数</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)someMethodWithFirstValue:(SomeType)value1&nbsp;secondValue:(AnotherType)value2;</span></div><span style="font-family: Courier; font-size: 10pt;">secondValue 是第二个参数签名的一部分</span><span style="font-family: Courier; font-size: 10pt;">，</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">因此，下面的函数签名不同：</span><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)someMethodWithFirstValue:(SomeType)info1&nbsp;anotherValue:(AnotherType)info2;<br /></span><span style="color: #000000; font-family: Courier;">-</span><span style="color: #000000; font-family: Courier;">(</span><span style="color: #0000ff; font-family: Courier;">void</span><span style="color: #000000; font-family: Courier;">)someMethodWithFirstValue:(SomeType)info1&nbsp;secondValue:(YetAnotherType)onfo2;</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">类名称必须唯一</span><br style="font-family: Courier; font-size: 10pt;" /><blockquote style="font-family: Courier; font-size: 10pt;">类名必须唯一，甚至和库或者框架里的类也不能重名，建议使用三个字符的前缀。<br />两个字母前缀，如NS，UI，已经被Apple保留<br /></blockquote><strong style="font-family: Courier; font-size: 10pt;"><br /></strong><strong style="font-size: 10pt; font-family: Courier;">类的实现</strong><br style="font-size: 10pt; font-family: Courier;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">基本语法</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#import&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">XYZPerson.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br />@implementation&nbsp;XYZPerson<br /><br />@end</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">实现方法</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;interface&nbsp;like&nbsp;this</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">@interface&nbsp;XYZPerson&nbsp;:&nbsp;NSObject<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)sayHello;<br />@end<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;implementation&nbsp;like&nbsp;this</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />@implementation&nbsp;XYZPerson<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)sayHello{<br />&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">Hello,&nbsp;World!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />}<br />@end</span></div><br style="font-family: Courier; font-size: 10pt;" /><strong style="font-family: Courier; font-size: 10pt;"><span style="font-size: 12pt; font-family: Courier;">类也是一个对象</span></strong><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">在OBJC里，类自己也是一个Class类型的对象。类类型不能通过声明的语法定义property，但是它可以接收消息。</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">类类型的方法的典型用途是工厂方法，用来进行对象的分配和初始化，如NSString的</span><span style="font-family: Courier; font-size: 10pt;">工厂方法</span><br style="font-family: Courier; font-size: 10pt;" /><br style="font-family: Courier; font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; font-family: Courier;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">string</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)stringWithString:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)aString;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)stringWithFormat:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)format,.. . </span><span style="color: #000000; font-family: Courier; font-size: 10pt;">;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)stringWithContentsOfFile:(NSString&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)path&nbsp;encoding:(NSStringEncoding)end&nbsp;error:(NSError&nbsp;</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">**</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)error;<br /></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">+</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">(id)stringWithCString:(</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-family: Courier; font-size: 10pt;">char</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">*</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">)cString&nbsp;encoding:(NSStringEncoding)enc;</span></div><br style="font-family: Courier; font-size: 10pt;" /><span style="font-family: Courier; font-size: 10pt;">+ 号表示这是一个类的方法</span></div><img src ="http://www.cppblog.com/cuigang/aggbug/204145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-19 18:34 <a href="http://www.cppblog.com/cuigang/archive/2013/11/19/204145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UTF8 to Unicode</title><link>http://www.cppblog.com/cuigang/archive/2013/11/17/204284.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Sun, 17 Nov 2013 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2013/11/17/204284.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/204284.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2013/11/17/204284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/204284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/204284.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; font-family: Courier; font-size: 10pt;">1</span>&nbsp;<span style="color: #008000; font-family: Courier; font-size: 10pt;">//</span><span style="color: #008000; font-family: Courier; font-size: 10pt;">unicode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; utf8</span><span style="color: #008000; "><br /></span><span style="color: #008080; font-family: Courier; font-size: 10pt;">2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0x0000</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">~</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0x007f</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;0xxxxxxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00~0x7f<br /></span><span style="color: #008080; font-family: Courier; font-size: 10pt;">3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0x0080</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">~</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0x07ff</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;110xxxxx&nbsp;10xxxxxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xCx 0x8x ~ 0xDx 0xBx<br /></span><span style="color: #008080; font-family: Courier; font-size: 10pt;">4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0x0800</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">~</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0xffff</span><span style="color: #000000; font-family: Courier; font-size: 10pt;">&nbsp;&nbsp;1110xxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp; </span><span style="color: #000000; font-family: Courier; font-size: 10pt;">0xEx 0x8x 0x8x ~ 0xEx Bx Bx</span><span style="color: #000000; "><br /></span></div><img src ="http://www.cppblog.com/cuigang/aggbug/204284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2013-11-17 10:31 <a href="http://www.cppblog.com/cuigang/archive/2013/11/17/204284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>