自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

程序員轉(zhuǎn)型指南 當(dāng)Java遇見(jiàn)了Objective-C

原創(chuàng)
移動(dòng)開(kāi)發(fā) iOS
本文為51CTO獨(dú)家譯文,講述了外國(guó)開(kāi)發(fā)者Genadiy Shteyman從Java開(kāi)發(fā)轉(zhuǎn)向Objective-C需要掌握技能。文章中作者使用一個(gè)社交網(wǎng)絡(luò)應(yīng)用作為例子,演示怎樣用這兩種語(yǔ)言建立開(kāi)發(fā)環(huán)境。例子中會(huì)包括創(chuàng)建基本對(duì)象與比較兩種語(yǔ)言的MVC設(shè)計(jì)模式,還會(huì)演示兩種語(yǔ)言中數(shù)據(jù)的存儲(chǔ)和獲取。

【51CTO譯文】目前在移動(dòng)開(kāi)發(fā)領(lǐng)域最重要的兩個(gè)平臺(tái)分別為Android平臺(tái)和iOS,在兩個(gè)平臺(tái)開(kāi)發(fā)應(yīng)用分別要用Java和Objective-C語(yǔ)言。雖然Java和Objective-C就像是處在兩個(gè)不同的世界,但這兩種編程語(yǔ)言以及它們的平臺(tái)庫(kù)等等還是有許多相似的地方。本文為51CTO獨(dú)家譯文,講述了外國(guó)開(kāi)發(fā)者Genadiy Shteyman從Java開(kāi)發(fā)轉(zhuǎn)向Objective-C需要掌握技能。

以下為全部譯文,(文章中的“我”指代"Genadiy Shteyman")

最近一段時(shí)間,我從編寫(xiě)企業(yè)Java應(yīng)用轉(zhuǎn)向使用Objective-C。經(jīng)過(guò)長(zhǎng)時(shí)間的困擾之后,我發(fā)現(xiàn)兩者的相似之處很多,如果能夠早些讀到相關(guān)的文章,轉(zhuǎn)換工作會(huì)容易得多。

所以我寫(xiě)下這篇文章,想要幫助Java程序員快速的掌握Objective-C開(kāi)發(fā)的主要特點(diǎn)。我使用一個(gè)社交網(wǎng)絡(luò)應(yīng)用作為例子,演示怎樣用這兩種語(yǔ)言建立開(kāi)發(fā)環(huán)境。例子中會(huì)包括創(chuàng)建基本對(duì)象與比較兩種語(yǔ)言的MVC設(shè)計(jì)模式,還會(huì)演示兩種語(yǔ)言中數(shù)據(jù)的存儲(chǔ)和獲取。

Objective-C開(kāi)發(fā):從哪里開(kāi)始

開(kāi)發(fā)iPhone應(yīng)用,首先最好要使用Mac電腦。最新的Mac OS X 10.6版本通常包含了一份Xcode IDE,以及使用Objective-C的配套iPhone開(kāi)發(fā)軟件工具套裝(圖表一)。

Xcode IDE開(kāi)發(fā)環(huán)境,項(xiàng)目視圖
圖表一:Xcode IDE開(kāi)發(fā)環(huán)境,項(xiàng)目視圖

2010年11月,蘋(píng)果發(fā)布了期待已久的iOS SDK 4.2,其中包含了豐富的框架和功能,用來(lái)搭建互動(dòng)iPhone應(yīng)用。Xcode還包含了一個(gè)仿真器,可以讓你在電腦中模擬程序運(yùn)行在手機(jī)上的效果。

Objective-C是iPhone應(yīng)用的主要開(kāi)發(fā)語(yǔ)言。對(duì)Java開(kāi)發(fā)者來(lái)說(shuō),幸運(yùn)的是Objective-C是完全面向?qū)ο蟮?,使用和其他OO語(yǔ)言相同的理念——繼承、多態(tài)和封裝等等。定義一個(gè)類(lèi)(Objective-C中稱為module或.m文件),首先要定義一個(gè)接口(一個(gè)header或.h文件),然后把它引入到類(lèi)中。

我們來(lái)看這個(gè)社交網(wǎng)絡(luò)應(yīng)用的例子,這個(gè)應(yīng)用需要建立一個(gè)聯(lián)系冊(cè),讓你和朋友們時(shí)常保持聯(lián)系。朋友的檔案存儲(chǔ)在FriendProfile對(duì)象中,包含四個(gè)字段:朋友的名字、城市、國(guó)家和電話號(hào)碼,如Listing One所示:

  1. Listing One  
  2. //  FriendProfile.h  
  3. #import <Foundation/Foundation.h>  
  4. #import <UIKit/UIKit.h>  
  5.  
  6. @interface FriendProfile : NSObject {  
  7. }  
  8. @property (nonatomic, retain) NSString * name;  
  9. @property (nonatomic, retain) NSString * country;  
  10. @property (nonatomic, retain) NSString * city;  
  11. @property (nonatomic, retain) NSString * phoneNbr;  
  12. @end  
  13. //FriendProfile.m  
  14. #import "FriendProfile.h"  
  15.  
  16. @implementation FriendProfile  
  17. @synthesize name;   
  18. @synthesize country;   
  19. @synthesize city;   
  20. @synthesize phoneNbr;  
  21. @end  

在這個(gè)例子中,接口FriendProfile:NSObject表示我們定義了一個(gè)叫做FriendProfile的接口,它從NSObject基類(lèi)中繼承各種功能。NSObject是Objective-C的根類(lèi),大多數(shù)Objective-C中用到的類(lèi)都會(huì)從中繼承,這和Java中的Object類(lèi)相似。接下來(lái),我們分配多個(gè)NSString類(lèi)型變量(等同于Java中的String類(lèi)型)用來(lái)存儲(chǔ)朋友的數(shù)據(jù)。然后是建立FriendProfile類(lèi),使用@synthesize關(guān)鍵字自動(dòng)創(chuàng)建各種get和set方法。建立一個(gè)FriendProfile對(duì)象可以使用如下的語(yǔ)句:

  1. FriendProfile * profile = [[FriendProfile alloc] init]; 

這里的alloc和init就像Java里的new關(guān)鍵字,用來(lái)在內(nèi)存中建立FriendProfile對(duì)象。接下來(lái),就可以給對(duì)象的各種字段賦值了。

  1. [profile setName:@"Albert"];  
  2. [profile setCountry:@"USA"];  
  3. [profile setCity:@"Houston"];  
  4. [profile setPhoneNbr:@"123-456-789"];  

或者可以更簡(jiǎn)單一點(diǎn):

  1. profile.name = @"Albert";  
  2. profile.country = @"USA";  
  3. profile.city = @"Houston;  
  4. profile.phoneNbr = @"123-456-789";  

想要充分了解Objective-C的語(yǔ)法和功能可以去蘋(píng)果的開(kāi)發(fā)者站點(diǎn),那里的語(yǔ)言參考編寫(xiě)的非常好。

Java的構(gòu)造

在Java中,如果我們想寫(xiě)一個(gè)FriendProfile類(lèi),所做的和Objective-C會(huì)非常相像,就像Listing Two所示:

  1. Listing Two  
  2. package com.vo;  
  3.  
  4. public class FriendProfile {  
  5.    private String name;  
  6.    private String country;  
  7.    private String city;  
  8.    private String phoneNbr;  
  9.  
  10.    public String getName() {  
  11.       return name;  
  12.    }  
  13.  
  14.    public void setName(String name) {  
  15.      this.name = name;  
  16.    }  
  17.  
  18.    public String getCountry() {  
  19.       return country;  
  20.    }  
  21.  
  22.    public void setCountry(String country) {  
  23.       this.country = country;  
  24.    }  
  25.  
  26.    public String getCity() {  
  27.       return city;  
  28.    }  
  29.  
  30.    public void setCity(String city) {  
  31.       this.city = city;  
  32.    }  
  33.  
  34.    public String getPhoneNbr() {  
  35.       return phoneNbr;  
  36.    }  
  37.  
  38.    public void setPhoneNbr(String phoneNbr) {  
  39.       this.phoneNbr = phoneNbr;  
  40.    }  
  41. }  

Listing Two中提供了相似的字段,但是那些get和set必須清楚的寫(xiě)出來(lái)。現(xiàn)在我們看看怎樣在通訊錄里添加一個(gè)新朋友,參加Listing Three:

  1. Listing Three   
  2. public class FriendlyServletController extends HttpServlet {  
  3.  
  4.     private static final long serialVersionUID = 1L;  
  5.  
  6.     /**  
  7.      * @see HttpServlet#doGet(HttpServletRequest request,   
  8.      * HttpServletResponse response)  
  9.      */ 
  10.     protected void doGet(HttpServletRequest request,   
  11.                          HttpServletResponse response)   
  12.               throws ServletException, IOException {  
  13.         doPost(request, response);  
  14.     }  
  15.  
  16.     /**  
  17.      * @see HttpServlet#doPost(HttpServletRequest request,   
  18.      * HttpServletResponse response)  
  19.      */ 
  20.     protected void doPost(HttpServletRequest request,   
  21.                           HttpServletResponse response)   
  22.               throws ServletException, IOException {  
  23.         response.setContentType("text/html");  
  24.         PrintWriter out = response.getWriter();       
  25.  
  26.         final String action =   
  27.                 request.getParameter("requestedAction");   
  28.  
  29.         if (action==null || action.trim().length()==0){  
  30.             out.println("invalid action requested");  
  31.             return;  
  32.         }  
  33.         else   
  34.         if (action.equalsIgnoreCase("addToContacts")){  
  35.               
  36.                 String name = request.getParameter("name");  
  37.             String country = request.getParameter("country");  
  38.             String city = request.getParameter("city");  
  39.             String phoneNbr = request.getParameter("phoneNbr");           
  40.             //normally you have to validate browser-originated requests  
  41.             boolean validParameters =   
  42.                     validateParameters(name, country, city, phoneNbr);  
  43.             if (validParameters==false){  
  44.                 out.println(  
  45.                    "please verify and submit correct information");  
  46.                 return;  
  47.             }  
  48.               
  49.             FriendProfile newProfile = new FriendProfile();  
  50.             newProfile.setName(name);  
  51.             newProfile.setCountry(country);  
  52.             newProfile.setCity(city);  
  53.             newProfile.setPhoneNbr(phoneNbr);  
  54.  
  55.             ProfileManager.getInstance().addToContacts(newProfile);  
  56.             out.println("Your friend is added to contacts");  
  57.             return;  
  58.         }  
  59.         else{  
  60.             out.println("invalid action requested");  
  61.             return;  
  62.         }         
  63.     }  
  64. }  

在這個(gè)例子里,F(xiàn)riendlyServletController類(lèi)從HTTPServlet中獲取行為,HTTPServlet是Java的客戶端組件類(lèi),負(fù)責(zé)處理瀏覽器的請(qǐng)求。當(dāng)用戶登入網(wǎng)站并且決定添加一個(gè)朋友時(shí),他會(huì)在HTML表單的字段中填入數(shù)據(jù),表單提交時(shí),Servlet收到并驗(yàn)證請(qǐng)求的參數(shù),并創(chuàng)建一個(gè)FriendProfile對(duì)象,在內(nèi)存中存儲(chǔ)數(shù)據(jù)。而ProfileManager類(lèi)會(huì)把你的FriendProfile對(duì)象存儲(chǔ)到數(shù)據(jù)庫(kù)中。#p#

Objective-C的MVC模式

在Java Web應(yīng)用中常采用Model-View-Controller(MVC)設(shè)計(jì)模式,iPhone開(kāi)發(fā)中也是如此。如果你在iOS Reference Library中查找UIViewController類(lèi)的定義,你會(huì)發(fā)現(xiàn)這樣的話:“UIViewController類(lèi)為iPhone應(yīng)用提供最基本的視圖管理模型……你可以使用UIViewController實(shí)例來(lái)管理視圖結(jié)構(gòu)。”UIViewController實(shí)際上是一個(gè)控制器組件,用來(lái)觸發(fā)業(yè)務(wù)邏輯,更新客戶端的視圖。

Model-View-Controller(MVC)設(shè)計(jì)模式
圖表2:Model-View-Controller(MVC)設(shè)計(jì)模式

如果你想在Xcode中創(chuàng)建一個(gè)UIViewController類(lèi)型的對(duì)象,可以選擇通過(guò)XIB文件來(lái)創(chuàng)建。這種特殊的Xcode文件定義了圖形用戶界面或者說(shuō)視圖,包含了各種不同的控件,比如按鈕、圖表和標(biāo)簽等等。

回到我們的例子中來(lái),假設(shè)你已經(jīng)在聯(lián)系列表中添加了幾個(gè)朋友,現(xiàn)在想按下某個(gè)朋友的鏈接來(lái)看查看他的詳細(xì)信息,這個(gè)功能可以通過(guò)定義控制器類(lèi)來(lái)完成。代碼請(qǐng)見(jiàn)Listing Four:

  1. Listing Four  
  2. //  FriendProfileViewController.h  
  3.  
  4. #import <UIKit/UIKit.h>  
  5.  
  6. @class FriendProfile;  
  7. @class DatabaseController;  
  8. @class MFriendProfile;  
  9.  
  10. // define our custom controller to inherit from  
  11. // the UIViewController class  
  12. @interface FriendProfileViewController : UIViewController {  
  13.     FriendProfile * profile;  
  14.     MFriendProfile * mprofile;  
  15.     DatabaseController *dbController;  
  16. }  
  17. @property(nonatomic, retain) IBOutlet UILabel *lname;  
  18. @property(nonatomic, retain) IBOutlet UILabel *lcountry;  
  19. @property(nonatomic, retain) IBOutlet UILabel *lcity;  
  20. @property(nonatomic, retain) IBOutlet UILabel *lphoneNbr;  
  21.  
  22. -(IBAction)buttonPressed:(id)sender;  
  23. @end  
  24.  
  25. #import "FriendProfileViewController.h"  
  26. #import "FriendProfile.h"  
  27. #import "DatabaseController.h"  
  28. #import "MFriendProfile.h"  
  29. @implementation FriendProfileViewController  
  30. ...  
  31.  
  32. // Implement viewDidLoad to do additional setup after   
  33. // loading the view, typically from a nib.  
  34. - (void)viewDidLoad {  
  35.     [super viewDidLoad];      
  36.  
  37.     //create sample profile  
  38.     profile = [[FriendProfile alloc] init];  
  39.     profile.name = @"Albert";   
  40.     profile.country = @"USA";   
  41.     profile.city = @"Houston";   
  42.     profile.phoneNbr = @"123-456-789";  
  43.  
  44.     //show profile on a screen  
  45.     lname.text = profile.name;  
  46.     lcountry.text = profile.country;  
  47.     lcity.text = profile.city;  
  48.     lphoneNbr.text = profile.phoneNbr;    
  49.  
  50. }  
  51.  
  52. //call the model to bring friend information from database  
  53. -(IBAction)buttonPressed:(id)sender{  
  54.     NSLog(@"fetching friend profile by name.");  
  55.     // name is hardcoded for demo purposes.   
  56. // Usually entered by user.  
  57. mprofile = (MFriendProfile*)  
  58.        [dbController getFriendProfileObjectbyName:@"Albert"];   
  59.  
  60.     lname.text = mprofile.name;  
  61.     lcountry.text = mprofile.country;  
  62.     lcity.text = mprofile.city;  
  63.     lphoneNbr.text = mprofile.phoneNbr;  
  64. }  

這段代碼中,我們創(chuàng)建了一個(gè)FriendProfileViewController實(shí)例,在我們定義的View Bundle中進(jìn)行初始化,顯示出朋友的各種信息。

Alloc和initWithNibName都是控制器類(lèi)創(chuàng)建實(shí)例時(shí)使用的方法,和Java的new關(guān)鍵字功能一樣。

模型在裝載視圖時(shí)開(kāi)始啟動(dòng)。每個(gè)控制器都有一些從父類(lèi)UIViewController繼承而來(lái)的生命周期方法。比如ViewdidLoad方法就是其中之一,它負(fù)責(zé)在視圖裝載之后的額外設(shè)置,從數(shù)據(jù)庫(kù)中取出信息,更新視圖。在最簡(jiǎn)單的情況下,我們的視圖包含一系列標(biāo)簽,或者是UILabel類(lèi)型的對(duì)象,可以在應(yīng)用運(yùn)行時(shí)設(shè)置各種文本,用戶可以立即看見(jiàn)朋友信息被更新了。

Java的MVC模式

下面來(lái)看看如何使用Java后臺(tái)在瀏覽器窗口中顯示出朋友的詳細(xì)信息。我們稍微修改一下FriendlyServletController即可,代碼請(qǐng)見(jiàn)Listing Five:

  1. Listing Five  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4.  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.  
  10. import com.model.ProfileManager;  
  11. import com.vo.FriendProfile;  
  12.  
  13. /**  
  14.  * Servlet implementation class FriendlyServletController  
  15.  */ 
  16. public class FriendlyServletController extends HttpServlet {  
  17.  
  18.    private static final long serialVersionUID = 1L;  
  19.  
  20.    /**  
  21.     * @see HttpServlet#doGet(HttpServletRequest request,   
  22.     * HttpServletResponse response)  
  23.     */ 
  24.    protected void doGet(HttpServletRequest request,   
  25.                         HttpServletResponse response)   
  26.              throws ServletException, IOException {  
  27.       doPost(request, response);  
  28.    }  
  29.  
  30.    /**  
  31.     * @see HttpServlet#doPost(HttpServletRequest request,   
  32.     *      HttpServletResponse response)  
  33.     */ 
  34.    protected void doPost(HttpServletRequest request,   
  35.                          HttpServletResponse response)   
  36.              throws ServletException, IOException {  
  37.       response.setContentType("text/html");  
  38.       PrintWriter out = response.getWriter();  
  39.  
  40.       final String action = request.getParameter("requestedAction");   
  41.  
  42.       if (action==null || action.trim().length()==0){  
  43.          out.println("invalid action requested");  
  44.          return;  
  45.       }  
  46.       else if(action.equalsIgnoreCase("showFriendProfile")){  
  47.          String name = request.getParameter("name");  
  48.          FriendProfile existProfile = new FriendProfile();  
  49.          existProfile.setName(name);  
  50.          existProfile =   
  51.             ProfileManager.getInstance().lookupContact(existProfile);  
  52.          if (existProfile==null){  
  53.              out.println("profile was not found");  
  54.          }else{  
  55.              out.println("here is your contact information:" +   
  56.              existProfile.getName() + " from " +   
  57.              existProfile.getCity() + " in " +   
  58.              existProfile.getCountry() + " at " +   
  59.              existProfile.getPhoneNbr());  
  60.          }  
  61.          return;              
  62.       }  
  63.       else if (action.equalsIgnoreCase("addToContacts")){  
  64.          String name = request.getParameter("name");  
  65.          String country = request.getParameter("country");  
  66.          String city = request.getParameter("city");  
  67.          String phoneNbr = request.getParameter("phoneNbr");  
  68.  
  69.          //normally you have to validate browser-originated requests  
  70.          boolean validParameters =   
  71.             validateParameters(name, country, city, phoneNbr);  
  72.          if (validParameters==false){  
  73.             out.println("please verify and submit correct information");  
  74.             return;  
  75.          }  
  76.  
  77.          FriendProfile newProfile = new FriendProfile();  
  78.          newProfile.setName(name);  
  79.          newProfile.setCountry(country);  
  80.          newProfile.setCity(city);  
  81.          newProfile.setPhoneNbr(phoneNbr);  
  82.  
  83.          ProfileManager.getInstance().addToContacts(newProfile);  
  84.          out.println("Your friend is added to contacts");  
  85.          return;  
  86.       }  
  87.       else{  
  88.          out.println("invalid action requested");  
  89.          return;  
  90.       }  
  91.    }  
  92.  
  93.    //basic parameter validation routine  
  94.    private boolean validateParameters(String name, String country,   
  95.                                       String city, String phoneNbr){  
  96.       /basic validation to check if all parameters are sent  
  97.       if (name==null || name.trim().length()==0 ||   
  98.          country==null || country.trim().length()==0 ||   
  99.          city ==null || city.trim().length()==0 ||   
  100.          phoneNbr == null || phoneNbr.trim().length()==0){  
  101.          return false;  
  102.       }  
  103.       return true;  
  104.    }  
  105. }  

在這個(gè)例子中,F(xiàn)riendlyServletController接收表單產(chǎn)生的HTTP請(qǐng)求,我們特別編寫(xiě)了一個(gè)事件叫做showFriendProfile。這里我們的模型是一個(gè)ProfileManager對(duì)象,負(fù)責(zé)通過(guò)朋友姓名在數(shù)據(jù)庫(kù)中查找記錄。然后查找到的數(shù)據(jù)庫(kù)記錄會(huì)以FriendProfile對(duì)象的形式返回到控制器,其中包含了各種詳細(xì)信息,組成視圖顯示在瀏覽器窗口中。#p#

Objective-C的數(shù)據(jù)庫(kù)訪問(wèn)

較復(fù)雜的應(yīng)用都會(huì)用到某類(lèi)數(shù)據(jù)存儲(chǔ)方式,通常是一個(gè)數(shù)據(jù)庫(kù)。蘋(píng)果推薦開(kāi)發(fā)者使用稱為Core Data的Cocoa API框架進(jìn)行數(shù)據(jù)庫(kù)存取操作。Core Data框架能夠直接與SQLite數(shù)據(jù)庫(kù)相結(jié)合(我們例子中的數(shù)據(jù)庫(kù)運(yùn)行在移動(dòng)設(shè)備上)。Core Data隱藏了復(fù)雜的SQL操作,取而代之的是非常方便的NSManagedObject界面,你可以直接操作整個(gè)對(duì)象實(shí)例的各種字段,這些字段可以自動(dòng)存入數(shù)據(jù)庫(kù)。Core Data框架的另一個(gè)方便之處是在數(shù)據(jù)庫(kù)中創(chuàng)建表(以及向表中添加關(guān)聯(lián)與限制),這些都可以在Core Data的用戶界面中完成。

Core Data stack結(jié)構(gòu)
圖表3:Core Data stack結(jié)構(gòu)

現(xiàn)在回到我們的社交網(wǎng)絡(luò)應(yīng)用例子,看看怎么從數(shù)據(jù)庫(kù)中取出朋友的信息。我們使用SQLite 和Core Data API,但首先我們要稍微修改一下FriendProfile類(lèi),代碼請(qǐng)見(jiàn)Listing Six:

  1. Listing Six  
  2. //FriendProfile.h interface file// MFriendProfile.h  
  3. #import <Foundation/Foundation.h>  
  4. #import <CoreData/CoreData.h>  
  5.  
  6. @interface MFriendProfile : NSManagedObject {  
  7.  
  8. }  
  9. @property (nonatomic, retain) NSString * name;  
  10. @property (nonatomic, retain) NSString * country;  
  11. @property (nonatomic, retain) NSString * city;  
  12. @property (nonatomic, retain) NSString * phoneNbr;  
  13.  
  14. @end 
  15.  
  16. // MFriendProfile.m  
  17. #import "MFriendProfile.h" 
  18.  
  19. @implementation MFriendProfile  
  20. @dynamic name;  
  21. @dynamic country;  
  22. @dynamic city;  
  23. @dynamic phoneNbr;  
  24.  
  25. @end 

這里的FriendProfile類(lèi)與Listing One中的不同之處在于在這里我加入了Core Data框架的頭文件。而且在這里我們的類(lèi)是從NSManagedObject中擴(kuò)展出來(lái),帶有了Core Data對(duì)象需要的全部基本行為。Core Data的NSManagedObject類(lèi)中使用到的Accessor則在應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建。如果你想在FriendProfile類(lèi)中聲明或使用屬性,但不想在編譯時(shí)出現(xiàn)缺少方法的警告,可以使用@dynamic指令,而不是@synthesize指令。

使用NSManagedObject API有些復(fù)雜,但你理解之后就會(huì)變得很好用。Listing Seven是一個(gè)示例方法,從數(shù)據(jù)庫(kù)的FRIENDPROFILE表中取得朋友的信息。表包含四列:NAME、COUNTRY、CITY和PHONE­NBR。

  1. Listing Seven  
  2. // DatabaseController.m  
  3. #import "DatabaseController.h" 
  4. #import <sqlite3.h>  
  5. #define kDatabaseName @"SocialNetworking.sqlite" 
  6.  
  7. ...  
  8.  
  9. - (NSManagedObject *)getFriendProfileObjectbyName:(NSString *)name {  
  10.  
  11.    managedObjectContext = [self managedObjectContext];    
  12.  
  13.    //create sort descriptors to specify preferred sort order 
  14.    NSSortDescriptor *sortDescriptor =   
  15.       [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];   
  16.    NSArray *sortDescriptors =   
  17.       [[NSArray alloc]  initWithObjects:sortDescriptor,nil];  
  18.  
  19.    //specify where clause   
  20.    NSPredicate *predicate =   
  21.       [NSPredicate predicateWithFormat:@"name == %d"name];      
  22.  
  23.     //fetch our friendís profile from database table   
  24.     NSEntityDescription *entity =  
  25.        [NSEntityDescription entityForName:@"MFRIENDPROFILE"   
  26.         inManagedObjectContext:managedObjectContext];     
  27.  
  28.     NSFetchRequest *request = [[NSFetchRequest alloc] init];  
  29.     [request setEntity:entity];  
  30.  
  31.     // Set the predicate for the current view 
  32.     if (predicate)   
  33.     {  
  34.         [request setPredicate:predicate];  
  35.     }  
  36.  
  37.     if (sortDescriptors)   
  38.     {  
  39.         [request setSortDescriptors:sortDescriptors];  
  40.     }  
  41.  
  42.    NSError *error = nil;  
  43.    NSMutableArray *results = [[managedObjectContext   
  44.       executeFetchRequest:request error:&error] mutableCopy];     
  45.  
  46.    if (error)  
  47.    {  
  48.       NSLog(@"error in getFriendProfileObjectbyName:%@",   
  49.       [error userInfo]);  
  50.    }  
  51.  
  52.    [sortDescriptor release];   
  53.    [sortDescriptors release];   
  54.    [predicate release];  
  55.  
  56.    if ([results count] > 0) {   
  57.       return [results objectAtIndex:0];  
  58.    }  
  59.    return nil;  
  60. }  

getFriendProfileObjectbyName方法把朋友的姓名作為一個(gè)參數(shù)接收過(guò)來(lái)。通過(guò)使用Core Data API,我們可以指定在哪一個(gè)表中進(jìn)行查詢和排序,并且在后臺(tái)執(zhí)行SQL語(yǔ)句。

  1. SQL>select * from FriendProfile where name = "Albert"

Core Data API有許多種沒(méi)有封裝的“半成品”代碼,可以訪問(wèn)NSManagedObjectContext、NSPersistentStoreCoordinator和NSManaged­ObjectModel對(duì)象。你可以復(fù)制這些代碼,只要你取得了FriendProfile對(duì)象,就能以下面的形式取得它的屬性:

  1. NSString* name =        FriendProfile.name;  
  2. NSString* country = FriendProfile.country;  
  3. NSString* city =        FriendProfile.city;  
  4. NSString* phoneNbr =    FriendProfile.phoneNbr;  

總的來(lái)說(shuō),Core Data是一個(gè)非常有用的功能,可以讓你通過(guò)圖表來(lái)定義數(shù)據(jù)表和管理,可以動(dòng)態(tài)生成相應(yīng)的對(duì)象,而且無(wú)需使用復(fù)雜的SQL語(yǔ)句。但不好的方面是這里有大量的沒(méi)有經(jīng)過(guò)封裝的代碼,這樣你在使用它們與測(cè)試時(shí)需要非常小心。

Java:數(shù)據(jù)庫(kù)存取

Java有許多數(shù)據(jù)庫(kù)框架。在我看來(lái),Hibernate是和Core Data API最相像的Java框架。Hibernate使用的是對(duì)象關(guān)系映射(Object-Relational Mapping,ORM)機(jī)制,這樣你可以通過(guò)簡(jiǎn)單的在對(duì)象中設(shè)置字段并且直接映射成數(shù)據(jù)庫(kù)中的表來(lái)把對(duì)象數(shù)據(jù)放入關(guān)系型數(shù)據(jù)庫(kù)中。映射可以通過(guò)XML文件,也可以通過(guò)Java 5中的metadata annotation方法獲得。Listing Eight是使用XML進(jìn)行映射的一個(gè)例子。

Listing Eight

此例中,Listing Two中的FriendProfile對(duì)象被映射到數(shù)據(jù)庫(kù)中的一個(gè)同名表,這是一種傳統(tǒng)的數(shù)據(jù)映射做法。對(duì)象的四個(gè)字段被直接映射到表中的四列,通過(guò)映射,Hibernate可以使用SQL語(yǔ)句來(lái)完成各種操作。

另一個(gè)配置文件叫做hibernate.cfg.xml,包含了數(shù)據(jù)庫(kù)連接設(shè)置的詳細(xì)信息,包括數(shù)據(jù)庫(kù)URL、數(shù)據(jù)庫(kù)驅(qū)動(dòng)以及用戶名和密碼等,代碼請(qǐng)見(jiàn)Listing Nine:

  1. Listing Eight  
  2. <hibernate-mapping> 
  3.   <class name="com.vo.FriendProfile" table=" FRIENPROFILE "> 
  4.   <property name="name"> 
  5.      <column name="NAME" /> 
  6.   </property> 
  7.  
  8.   <property name="country"> 
  9.     <column name="COUNTRY"/> 
  10.   </property> 
  11.  
  12. <property name="city"> 
  13.     <column name="CITY"/> 
  14.   </property> 
  15.   <property name="phoneNbr"> 
  16.     <column name="PHONENBR"/> 
  17.   </property> 
  18.  </class> 
  19. </hibernate-mapping> 

Listing Nine中我們導(dǎo)入了所有需要的Hibernate庫(kù),創(chuàng)建了一個(gè)Hibernate Session并且開(kāi)始事務(wù),接下來(lái)我們僅簡(jiǎn)單使用了Session對(duì)象的get方法就輕松檢索到了FriendProfile對(duì)象,傳遞回所需要的對(duì)象類(lèi)型并過(guò)濾出查詢的字段——朋友的姓名。#p#

結(jié)論

除去語(yǔ)法結(jié)構(gòu)與運(yùn)行平臺(tái)的不同,使用Objective-C進(jìn)行iPhone開(kāi)發(fā)與使用Java進(jìn)行網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)在下面幾個(gè)方面是相同的:

◆兩種語(yǔ)言都是面向?qū)ο蟮?/p>

◆兩種語(yǔ)言使用同樣的設(shè)計(jì)模式,例如MVC

◆兩種語(yǔ)言使用相似的數(shù)據(jù)庫(kù)存儲(chǔ)技術(shù),例如ORM

然而,對(duì)于Java開(kāi)發(fā)者,使用Objective-C時(shí)在有些地方要格外小心:

◆創(chuàng)建對(duì)象:Java對(duì)象是在運(yùn)行時(shí)通過(guò)new關(guān)鍵字創(chuàng)建的。因此Java程序員無(wú)需擔(dān)心內(nèi)存分配問(wèn)題。而在Objective-C中,一個(gè)對(duì)象可以由三個(gè)關(guān)鍵字創(chuàng)建,alloc、new或者copy,這三個(gè)關(guān)鍵字在創(chuàng)建對(duì)象時(shí)都會(huì)增加對(duì)象的持有計(jì)數(shù)(retain count),持有計(jì)數(shù)是Objective-C特有的內(nèi)存管理方法,顯示有多少個(gè)指針指向?qū)ο螅欠窨梢员粌?nèi)存管理器回收。

◆銷(xiāo)毀對(duì)象:由于強(qiáng)大的垃圾回收機(jī)制,Java的內(nèi)存管理工作極度簡(jiǎn)單。Java的引用對(duì)象都存儲(chǔ)在JVM的堆內(nèi)存中,一旦不再被引用,就可以作為垃圾回收。Objective-C使用的是內(nèi)存管理器,而不是垃圾回收器。如果你使用上面說(shuō)的三種方法在內(nèi)存中創(chuàng)建了一個(gè)對(duì)象,那么必須使用release方法來(lái)釋放對(duì)象。release方法會(huì)減少持有計(jì)數(shù),當(dāng)計(jì)數(shù)降到0時(shí),被引用的對(duì)象會(huì)接受一個(gè)來(lái)自高級(jí)類(lèi)的dealloc方法,釋放它占用的內(nèi)存并重新分配。如果忘記了釋放內(nèi)存或釋放失敗,那么會(huì)造成內(nèi)存泄露和不可預(yù)見(jiàn)的錯(cuò)誤。

◆過(guò)多釋放和過(guò)早重新分配內(nèi)存:由于垃圾回收機(jī)制,Java程序員可以完全不考慮這些問(wèn)題。但Objective-C程序員需要小心,不能釋放出比分配的更多的內(nèi)存。如果在已經(jīng)重新分配的對(duì)象上過(guò)多釋放內(nèi)存,就會(huì)造成應(yīng)用的崩潰。

上面這些例子說(shuō)明了Objective-C和Java在語(yǔ)法和語(yǔ)言元素上有很多相同之處。更重要的是,它們解決問(wèn)題的思路和用到的組件也是非常相似的。如果你是Java程序員,相信你在看完這篇文章后,轉(zhuǎn)向Objective-C的道路會(huì)更加通順。

【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文出處、作者及51CTO譯者!】

 

責(zé)任編輯:佚名 來(lái)源: 51CTO
相關(guān)推薦

2011-08-05 15:46:32

Objective-C 程序設(shè)計(jì)

2021-01-23 20:00:53

程序員技能開(kāi)發(fā)者

2011-08-17 10:29:39

Objective-C預(yù)處理

2015-06-25 11:21:33

C++Objective-C

2011-08-10 18:07:29

Objective-C反射

2011-08-04 13:32:21

Objective-C 方法 對(duì)象

2013-03-27 12:54:00

iOS開(kāi)發(fā)Objective-C

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-08-02 13:16:36

Objective-C 語(yǔ)法 函數(shù)

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2013-08-21 14:57:42

objective-c問(wèn)題

2011-05-11 14:06:49

Objective-C

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2014-04-30 10:16:04

Objective-CiOS語(yǔ)法

2011-08-03 16:55:05

Objective-C 代理

2011-07-08 13:49:46

Objective-C UUID
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)