<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Macfeteria &#187; NSMutableString</title>
	<atom:link href="http://www.macfeteria.com/blog/tag/nsmutablestring/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.macfeteria.com</link>
	<description>All About Mac and iPhone Programming</description>
	<lastBuildDate>Tue, 09 Aug 2011 04:34:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Foundation Framework II &#8211; String</title>
		<link>http://www.macfeteria.com/blog/2008/03/22/foundation-framework-ii/</link>
		<comments>http://www.macfeteria.com/blog/2008/03/22/foundation-framework-ii/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 17:06:10 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[NSMutableString]]></category>
		<category><![CDATA[NSString]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://maccafe.wordpress.com/?p=32</guid>
		<description><![CDATA[หลังจากที่ได้ลองใช้งาน Framework ไปบ้างแล้ว วันนี้ก็มาดูตัวอย่างการใช้งาน String กันบ้าง โดยปกติแล้วเราจะมี Class เพื่อใช้ในการจัดการเกี่ยวกับ string อยู่ด้วยกัน 2 class นั่นก็คือ NSString NSMutableString สอง class นี้มี method ที่คล้ายกัน เพราะว่า NSMutableString นั้นเป็น Child-Class ของ NSString NSString NSString นั้นเป็น class ที่เอาไว้จัดการ string ทั้งหลายไม่ว่าจะเป็นการ copy , compare , substring แต่มีข้อจำกัดคือ มันไม่สามารถที่จะแก้ไขได้หลังจากการ initial ไปแล้ว เรามาดูตัวอย่างการใช้งานของ NSString กัน #import &#60;Foundation/Foundation.h&#62; &#160; int main&#40;int argc, char *argv&#91;&#93;&#41; &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากที่ได้ลองใช้งาน Framework ไปบ้างแล้ว วันนี้ก็มาดูตัวอย่างการใช้งาน String กันบ้าง<br />
โดยปกติแล้วเราจะมี Class เพื่อใช้ในการจัดการเกี่ยวกับ string อยู่ด้วยกัน 2 class นั่นก็คือ</p>
<ul>
<li> NSString</li>
<li>NSMutableString</li>
</ul>
<p>สอง class นี้มี method ที่คล้ายกัน เพราะว่า NSMutableString นั้นเป็น Child-Class ของ NSString</p>
<h2>NSString</h2>
<p>NSString นั้นเป็น class ที่เอาไว้จัดการ string ทั้งหลายไม่ว่าจะเป็นการ copy , compare , substring แต่มีข้อจำกัดคือ มันไม่สามารถที่จะแก้ไขได้หลังจากการ initial ไปแล้ว</p>
<p>เรามาดูตัวอย่างการใช้งานของ NSString กัน</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;Foundation/Foundation.h&gt;</span>
&nbsp;
<span style="color: #a61390;">int</span> main<span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> argc, <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>argv<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span>pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Init String</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szResult;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr	<span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello &quot;</span>;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr2 <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span>;
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr3 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;Welcome to &quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr4 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr1: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr2: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr2 cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr3: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr3 cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Copy String</span>
	szStr4 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span>szStr<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr4: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr4 cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Compare</span>
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> szStr <span style="color: #002200;">==</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</span><span style="color: #002200;">&#41;</span>
		<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Equal hello<span style="color: #2400d9;">\n</span>&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>szStr isEqualToString<span style="color: #002200;">:</span>szStr2<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
		<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Equal szStr2<span style="color: #2400d9;">\n</span>&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Append string</span>
	szResult <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>szStr3 stringByAppendingString<span style="color: #002200;">:</span>szStr2<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Append 1: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szResult cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Uppercase</span>
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Upper: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>szStr3 uppercaseString<span style="color: #002200;">&#93;</span> cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Extract first 4 char</span>
	szResult <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>szStr3 substringToIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Substring: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szResult cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	szResult <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>szStr3 substringFromIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span> substringToIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">3</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;SubString from-to: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szResult cString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">int</span> length <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>szStr3 length<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Length szStr3: %d<span style="color: #2400d9;">\n</span>&quot;</span>,length<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>pool release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จาก ข้างบน จะเห็นว่าประกาศตัวแปรเป็น NSString*  ทั้งหมด 5 ตัวแปร  แต่การประกาศนั้นต่างกันออกไป โดยที่</p>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szResult;</pre></div></div>

<p>ก็ทำการประกาศตัวแปรขึ้นมาแบบเป็น pointer ไว้เฉยๆ</li>
</ul>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr	<span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello &quot;</span>;</pre></div></div>

</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr2 <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span>;</pre></div></div>

<p>ประกาศตัวแปรขึ้นมาโดยกำหนดให้เป็นคำว่า Hello และ Macfeteria สังเกตุว่าจะมีเครื่องหมาย @ นำหน้าก็เพื่อบอกว่า &#8220;Macfeteria&#8221; เป็น Constance String Object</li>
</ul>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr3 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithCString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;Welcome to &quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>การประกาศแบบนี้น่าจะคุ้นน่ะเพราะว่า เราได้ทำการ alloc และแบบนี้เราก็สามารถ นำเอา char* มาแปลงให้เป็น NSString ได้ ยกตัวอย่างเช่น</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">&quot;Welcome to &quot;</span>;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr3 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithCString<span style="color: #002200;">:</span>text<span style="color: #002200;">&#93;</span>;</pre></div></div>

</li>
</ul>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>szStr4 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>ประกาศและจองพื้นที่ไว้แต่ยังไม่ได้เอาไปใช้งาน</li>
</ul>
<p>หลังจากประกาศตัวแปรก็มีการเรียกการใช้งาน Function ของ NSString  ก็มีตั้งแต่การ copy , compare , concatenate , substring  ที่จะขออธิบายก็ที่เห็นบ่อยๆจากตัวอย่างคือ<br />
cString สำหรับ cString จะเป็นการ return string ในรูปแบบของ char* กลับมา  แบบนี้เราก็สามารถนำไปใช้ได้กับ printf หรือ function ของภาษา C ได้<br />
และก็จะมี การเปรียบเทียบ เราอาจจะเปรียบเทียบโดยใช้ == แบบปกติ (แต่ต้องอย่าลืม @ นำหน้าด้วย) หรืออาจจะใช้ function  <span style="color: #a0410d;">isEqualToString </span>ก็ได้</p>
<p>เมื่อทำการ compile และ run program เราจะได้เห็นผลลัพธ์แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/03/string.png" rel="lightbox[73]"><img class="aligncenter size-medium wp-image-527" title="string" src="http://www.macfeteria.com/wp-content/uploads/2008/03/string-300x129.png" alt="string" width="300" height="129" /></a></p>
<p>ในระหว่าง ที่ compile หลายคนอาจจะเห็นว่า มันจะขึ้น warning ในลักษณะแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/03/warning.png" rel="lightbox[73]"><img class="aligncenter size-medium wp-image-528" title="warning" src="http://www.macfeteria.com/wp-content/uploads/2008/03/warning-300x147.png" alt="warning" width="300" height="147" /></a></p>
<p>ก็ไม่ต้องไปตกใจอะไรนะครับ จริงๆมันก็ทำงานได้แต่ที่มันขึ้น warning &#8220;cString&#8221; is deprecated แบบนี้มาก็เนื่องจากว่า cString ที่เราได้เรียกใช้นั้น SDK 10.5 ไม่ได้ใช้แล้วและในอนาคตก็คงจะเอาออก ก็แปลได้ง่ายๆว่า cString มันจะใช้ไม่ได้ในอนาคต ถ้าหากว่าเรามีแผนการต้องเปลี่ยน ไปใช้ SDK ที่ใหม่กว่าในอนาคต ก็ควรจะเลิกใช้ cString เปลี่ยนไปใช้  อย่างอื่นแทน ในกรณีนี้ เค้าแนะนำว่า ให้ไปใช้ cStringUsingEncoding: แทน ฉนั้นแล้ว เราก็อาจจะเขียน ใหม่ได้ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr1: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr cStringUsingEncoding<span style="color: #002200;">:</span> NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr2: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr2 cStringUsingEncoding<span style="color: #002200;">:</span> NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;szStr3: %s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>szStr3 cStringUsingEncoding<span style="color: #002200;">:</span> NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>ในส่วนของ NSUTF8StringEncoding นี้ก็เป็น parameter ที่บอกว่าให้ encode string ออกมาเป็นแบบไหน คือเนื่องจากว่า char ปกติแล้วมันเก็บข้อมูลในลักษณะ 1 byte ฉนั้นแล้วก็จะมีตัวอักษรทั้งหมดแค่ 256 เท่านั้น ต่อมาเมื่อภาษาต่างๆเริ่มมีความสำคัญ เค้าก็เลยเปลี่ยนไปเก็บ string ในรูปแบบที่ไม่ใช่ char แต่เป็น ลักษณะแบบอื่นแทน อาทิเช่น multiple byte , wide char และด้วยเหตุนี้เอง เราจำเป็นต้องระบุว่า จะให้มัน encode string ออกมาเป็นอะไร</p>
<h2>NSMutableString</h2>
<p>เป็น class ที่เอาไว้จัดการ string เหมือนกัน แต่ต่างกันตรงที่ มันสามารถแก้ไขได้ ภายหลัง ดูตัวอย่างการใช้งาน NSMutableString</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;Foundation/Foundation.h&gt;</span>
&nbsp;
<span style="color: #a61390;">int</span> main <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> argc, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> argv<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span>pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Init String</span>
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>muString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello &quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Init String</span>
	<span style="color: #002200;">&#91;</span>muString appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Insert String</span>
	<span style="color: #002200;">&#91;</span>muString insertString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;I'm Ter &quot;</span> atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">6</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Delete Character in Range</span>
	<span style="color: #002200;">&#91;</span>muString deleteCharactersInRange<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">9</span>, <span style="color: #2400d9;">4</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Replace Character in Range</span>
	<span style="color: #002200;">&#91;</span>muString replaceCharactersInRange<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">6</span>,<span style="color: #2400d9;">4</span><span style="color: #002200;">&#41;</span> withString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;this is &quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Set new String</span>
	<span style="color: #002200;">&#91;</span>muString setString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Welcome to Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>pool release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เมื่อทำการ compile และ run ก็จะได้ผลลัพธ์ดังตัวอย่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/03/mutablestring.png" rel="lightbox[73]"><img class="aligncenter size-medium wp-image-534" title="mutablestring" src="http://www.macfeteria.com/wp-content/uploads/2008/03/mutablestring-300x152.png" alt="mutablestring" width="300" height="152" /></a></p>
<p style="text-align: left;">ดูจากตัวอย่าง code แล้วคิดว่าไม่น่าจะยากนะครับ</p>
<h2>NSMutableString VS NSString</h2>
<p>ข้อที่แตกต่างระหว่าง NSMutableString และ NSString นั้นนอกจากเรื่องที่แก้ไข string ได้และไม่ได้ ยังคงมีข้อควรระวังอยู่ ยกตัวอย่างเช่น</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>muString <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello &quot;</span>;
<span style="color: #002200;">&#91;</span>muString appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>,<span style="color: #002200;">&#91;</span>muString cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>ดูจากตัวอย่าง code ข้างบนแล้วแทบจะไม่น่าจะผิดอะไรเลย compile ก็ผ่านปกติ แต่ว่าเวลาที่ run จริงๆ มันจะไม่ผ่านครับ จะเห็นเกิด error แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/03/error.png" rel="lightbox[73]"><img class="aligncenter size-medium wp-image-535" title="error" src="http://www.macfeteria.com/wp-content/uploads/2008/03/error-300x152.png" alt="error" width="300" height="152" /></a></p>
<p>ด้วยเหตผลก็เพราะว่า จริงอยู่ว่าเราประกาศ NSMutableString ขึ้นมาใช้ แต่ตอนที่เรา init มันเรากลับ init ให้มันเป็น NSString ( string ที่ประกาศด้วยเครื่องหมาย @ จะถือว่าเป็น NSString หรือพูดง่ายคือเป็น Constance ไม่สามารถแก้ไขได้ )</p>
<p>และอีกตัวอย่าง ลองดู  code ต่อไปนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> ns <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</span><span style="color: #002200;">&#93;</span>;
ns <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>ns stringByAppendingString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #400080;">NSMutableString</span> muString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> alloc<span style="color: #002200;">&#93;</span> initWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>muString appendString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>จะเห็นว่า code ทั้งสองอย่างไม่ว่าจะเป็น NSMutableString และ NSString นั้นก็สามารถ append string ได้เหมือนกัน<br />
แล้วมันต่างกันยังไง ?<br />
จาก code นะครับ  NSString</p>
<ul>
<li>ns ชี้ pointer ไปยัง memory เพื่อทำการจอง string &#8220;Hello&#8221;</li>
<li>หลังจากนั้นจะเห็นว่า ns ต้องการ append string &#8220;Macfeteria&#8221;</li>
<li>แต่สิ่งที่ ns ทำจริงๆคือ การย้าย pointer ชี้ไปยังตำแหน่งของ memory ใหม่ที่ได้จากการสร้าง string โดย append</li>
</ul>
<p>ส่วน NSMutableString</p>
<ul>
<li>muString ชี้ pointer ไปยัง memory เพื่อทำการจอง string &#8220;Hello&#8221;</li>
<li>muString ทำการ append string &#8220;Macfeteria&#8221; ยังตำแหน่ง memory เดิม</li>
</ul>
<p>ฉนั้นแล้ว การ Append ในกรณี NSString  นั้นจะเกิด Memory Leak  ครับ เพราะ s ได้ย้าย pointer ไปชี้ยัง memory ส่วนใหม่ (Hello Macfeteria) ส่วนตำแหน่งเดิม (Hello) ก็ไม่ได้ release  จึงเกิด Memory Leak ขึ้น</p>
<p>ถ้าหากต้องการ แก้ไข code ที่ถูกต้องควรจะเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"> ns <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>s autorelease<span style="color: #002200;">&#93;</span> stringByAppendingString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>ก็เพิ่ม autorelease เข้าไปเพื่อให้มัน release memory หลังจากไม่ได้ใช้แล้วโดยอัตโนมัติ</p>
<p>ก็ลองศึกษาเพิ่มเติมการใช้งานได้จาก web ของ apple ได้เองที่ <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html">http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html</a></p>
<p>ส่วน source code ก็นี่เลย <a href="http://www.macfeteria.com/wp-content/uploads/2008/07/foundation_framework_2.zip">Download Foundation Framework II (NSString) Soure Files</a></p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/basic' rel='tag' target='_self'>basic</a>, <a class='technorati-link' href='http://technorati.com/tag/foundation' rel='tag' target='_self'>foundation</a>, <a class='technorati-link' href='http://technorati.com/tag/NSMutableString' rel='tag' target='_self'>NSMutableString</a>, <a class='technorati-link' href='http://technorati.com/tag/NSString' rel='tag' target='_self'>NSString</a>, <a class='technorati-link' href='http://technorati.com/tag/objective-c' rel='tag' target='_self'>objective-c</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/03/22/foundation-framework-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

