[程序員日記]又見UIApplication

在開發(fā)過程中,我們很少真正研究過這個(gè)類辈挂,很多半路出家的程序員對(duì)于view的生命周期有所了解衬横,但對(duì)UIApplication未深入研究。在開發(fā)過程中终蒂,相信我們都或多或少的使用了其中的很多功能蜂林,下面就來探討和總結(jié)一下其中的內(nèi)容,又見iOS拇泣,就讓我們從main開始噪叙,重新進(jìn)入iOS的新世界。

應(yīng)用程序生命周期

簡(jiǎn)述UIApplication##

UIApplication的核心作用是提供了iOS程序運(yùn)行期間的控制和協(xié)作工作挫酿。每一個(gè)程序在運(yùn)行期必須有且僅有一個(gè)UIApplication(或則其子類)的一個(gè)實(shí)例构眯。在程序開始運(yùn)行的時(shí)候,UIApplicationMain函數(shù)是程序進(jìn)入點(diǎn)早龟,這個(gè)函數(shù)做了很多工作惫霸,其中一個(gè)重要的工作就是創(chuàng)建一個(gè)UIApplication單例實(shí)例。在你的代碼中你葱弟,你可以通過調(diào)用[UIApplication sharedApplication]來得到這個(gè)單例實(shí)例的指針壹店。

UIApplication的一個(gè)主要工作是處理用戶事件,它會(huì)起一個(gè)隊(duì)列芝加,把所有用戶事件都放入隊(duì)列硅卢,逐個(gè)處理,在處理的時(shí)候藏杖,它會(huì)發(fā)送當(dāng)前事件到一個(gè)合適的處理事件的目標(biāo)控件将塑。此外,UIApplication實(shí)例還維護(hù)一個(gè)在本應(yīng)用中打開的window列表(UIWindow實(shí)例)蝌麸,這樣它就可以接觸應(yīng)用中的任何一個(gè)UIView對(duì)象点寥。UIApplication實(shí)例會(huì)被賦予一個(gè)代理對(duì)象,以處理應(yīng)用程序的生命周期事件(比如程序啟動(dòng)和關(guān)閉)来吩、系統(tǒng)事件(比如來電敢辩、記事項(xiàng)警告)等等。

新建一個(gè)任意類型的iOS應(yīng)用工程弟疆,我們可以看到工程中生成一個(gè)類:
AppDelegate :UIResponder <UIApplicationDelegate>
這里這個(gè)類的基類是UIResponder(注:iOS 4.2以前生成的工程是不同的戚长,以前是繼承自NSObject)。不論如何怠苔,本類實(shí)現(xiàn)了一個(gè)名叫UIApplicationDelegate的接口同廉,這個(gè)表明這個(gè)類就是這個(gè)工程中UIApplication實(shí)例的代理類。

main函數(shù)中,

int main(int argc, char * argv[]) {
  @autoreleasepool {
      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

這里傳入了代理類到UIApplicationMain函數(shù)中恤溶,UIApplicationMain函數(shù)在生成唯一個(gè)UIApplication的時(shí)候就可以把代理類的實(shí)例指針告訴這個(gè)單例對(duì)象了乓诽。

[注]參數(shù)說明
argc:系統(tǒng)或者用戶傳入的參數(shù)
argv:系統(tǒng)或用戶傳入的實(shí)際參數(shù)
1.根據(jù)傳入的第三個(gè)參數(shù),創(chuàng)建UIApplication對(duì)象
2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
4.開啟一個(gè)事件循環(huán)(可以理解為里面是一個(gè)死循環(huán))這個(gè)時(shí)間循環(huán)是一個(gè)隊(duì)列(先進(jìn)先出)先添加進(jìn)去的先處理

UIApplication生命周期##

1咒程、
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

說明:當(dāng)應(yīng)用程序正常啟動(dòng)時(shí)(不包括已在后臺(tái)轉(zhuǎn)到前臺(tái)的情況)鸠天,調(diào)用此回調(diào)。launchOptions是啟動(dòng)參數(shù)帐姻,假如用戶通過點(diǎn)擊push通知啟動(dòng)的應(yīng)用稠集,(這是非正常啟動(dòng)的情況,包括本地通知和遠(yuǎn)程通知)饥瓷,這個(gè)參數(shù)里會(huì)存儲(chǔ)一些push通知的信息剥纷。

2、
- (void)applicationWillResignActive:(UIApplication *)application

說明:當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行呢铆,在此期間晦鞋,應(yīng)用程序不接收消息或事件,比如來電話了

3棺克、
- (void)applicationDidBecomeActive:(UIApplication *)application

說明:當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行悠垛,這個(gè)剛好跟上面那個(gè)方法相反

4、
- (void)applicationDidEnterBackground:(UIApplication *)application

說明:當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用娜谊。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行,則在這個(gè)函數(shù)里面設(shè)置即可

5纱皆、
- (void)applicationWillEnterForeground:(UIApplication *)application

說明:當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用,這個(gè)剛好跟4相反派草。

6、
- (void)applicationWillTerminate:(UIApplication *)application

說明:當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用近迁,通常是用來保存數(shù)據(jù)和一些退出前的清理工作胡嘿。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值钳踊。

7勿侯、
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

說明:iPhone設(shè)備只有有限的內(nèi)存拓瞪,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會(huì)終止應(yīng)用程序的運(yùn)行,在終止前會(huì)執(zhí)行這個(gè)方法助琐,通臣拦。可以在這里進(jìn)行內(nèi)存清理工作防止程序被終止

8蛆橡、
- (void)applicationSignificantTimeChange:(UIApplication*)application

說明:當(dāng)系統(tǒng)時(shí)間發(fā)生改變時(shí)執(zhí)行

9、
- (void)applicationDidFinishLaunching:(UIApplication*)application

說明:當(dāng)程序載入后執(zhí)行

10泰演、
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
說明:當(dāng)客戶端注冊(cè)遠(yuǎn)程通知時(shí)睦焕,會(huì)回調(diào)的方法藐握。
如果成功猾普,則回調(diào)這個(gè)方法本谜,客戶端把deviceToken取出來發(fā)給服務(wù)端,push消息的時(shí)候要用乌助。
如果失敗了眷茁,則回調(diào)下面的方法,可以從error參數(shù)中看一下失敗原因上祈。

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

11登刺、
- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame

說明:當(dāng)StatusBar框?qū)⒁兓瘯r(shí)執(zhí)行

- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientationduration:(NSTimeInterval)duration

說明:當(dāng)StatusBar框方向?qū)⒁兓瘯r(shí)執(zhí)行

- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

說明:當(dāng)StatusBar框方向變化完成后執(zhí)行

- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

說明:當(dāng)StatusBar框變化完成后執(zhí)行

12、
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

說明:當(dāng)通過url執(zhí)行

13纸俭、

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

說明:當(dāng)應(yīng)用在前臺(tái)運(yùn)行中,收到遠(yuǎn)程通知時(shí)(不會(huì)彈出系統(tǒng)通知界面)揍很,會(huì)回調(diào)這個(gè)方法窒悔。
當(dāng)應(yīng)用在后臺(tái)狀態(tài)時(shí),點(diǎn)擊push消息啟動(dòng)應(yīng)用简珠,也會(huì)回調(diào)這個(gè)方法。
當(dāng)應(yīng)用完全沒有啟動(dòng)時(shí)膘融,點(diǎn)擊push消息啟動(dòng)應(yīng)用,就不會(huì)回調(diào)這個(gè)方法春畔。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler

與上一方法相同屯耸,區(qū)別是在后臺(tái)時(shí)亦可執(zhí)行方法疗绣,但要開啟相關(guān)權(quán)限。如圖多矮。


開啟權(quán)限
-  (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

說明:當(dāng)應(yīng)用收到本地通知時(shí)會(huì)調(diào)這個(gè)方法塔逃,同上面一個(gè)方法類似。
如果在前臺(tái)運(yùn)行狀態(tài)直接調(diào)用
如果在后臺(tái)狀態(tài)伏蚊,點(diǎn)擊通知啟動(dòng)時(shí)格粪,也會(huì)回調(diào)這個(gè)方法
當(dāng)應(yīng)用完全沒有啟動(dòng)時(shí),點(diǎn)擊push消息啟動(dòng)應(yīng)用比伏,就不會(huì)回調(diào)這個(gè)方法疆导。

[補(bǔ)充]1.iPhone中的應(yīng)用程序很容易受到打擾,比如一個(gè)來電可能導(dǎo)致應(yīng)用程序失去焦點(diǎn)悠菜,如果這個(gè)時(shí)候接聽了電話败富,那么應(yīng)用程序會(huì)轉(zhuǎn)到后臺(tái)運(yùn)行。還有很多其它類似的事件會(huì)導(dǎo)致iPhone應(yīng)用程序失去焦點(diǎn),在應(yīng)用程序失去焦點(diǎn)前會(huì)調(diào)用委托類的applicationWillResignActive()方法充择,而應(yīng)用程序再次獲取到焦點(diǎn)的時(shí)候會(huì)調(diào)用applicationDidBecomeActive()方法。比如在運(yùn)行應(yīng)用程序的時(shí)候鎖屏?xí){(diào)用委托類的applicationWillResignActive()方法宰僧,而當(dāng)屏幕被解鎖的時(shí)候观挎,又會(huì)調(diào)用applicationDidBecomeActive()方法。

2.另外一個(gè)非常重要的方法就是applicationDidReceiveMemoryWarning()造成,因?yàn)閕Phone設(shè)備只有有限的內(nèi)存雄嚣,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會(huì)終止應(yīng)用程序的運(yùn)行,但在終止之前操作系統(tǒng)會(huì)通過先調(diào)用委托類的applicationDidReceiveMemoryWarning()方法警告應(yīng)用程序鼓鲁,在UIApplication接收到這個(gè)事件后它會(huì)傳遞給委托類的applicationDidReceiveMemoryWarning()方法港谊,委托類在這個(gè)方法內(nèi)可以進(jìn)行釋放內(nèi)存的操作以防止操作系統(tǒng)強(qiáng)制終止應(yīng)用程序的運(yùn)行。

UIApplication部分常用功能##

1.設(shè)置icon上的數(shù)字圖標(biāo)燥狰,缺省為0

[UIApplication sharedApplication].applicationIconBadgeNumber = 1;

2.設(shè)置搖動(dòng)手勢(shì)的時(shí)候成福,是否支持redo,undo操作,缺省YES

[UIApplication sharedApplication].applicationSupportsShakeToEdit =YES;

3.判斷程序運(yùn)行狀態(tài)

typedef NS_ENUM(NSInteger, UIApplicationState) {
    UIApplicationStateActive, 
    UIApplicationStateInactive,
    UIApplicationStateBackground
} NS_ENUM_AVAILABLE_IOS(4_0);

if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
    NSLog(@"程序在運(yùn)行狀態(tài)");
 }

4.阻止屏幕變暗進(jìn)入休眠狀態(tài)净当,缺省為no

 [UIApplication sharedApplication].idleTimerDisabled =YES;

[注意??]除視頻播放等需要常亮等功能外蕴潦,慎重使用本功能潭苞,因?yàn)?strong>非常耗電。

5.顯示聯(lián)網(wǎng)狀態(tài)動(dòng)畫

[UIApplication sharedApplication].networkActivityIndicatorVisible =YES;

6.設(shè)置狀態(tài)欄的樣式

typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
    UIStatusBarStyleDefault   = 0, // 默認(rèn)樣式僧诚,黑字,適用于淺色背景(iOS6及以下系統(tǒng)狀態(tài)欄為黑底白字)
    UIStatusBarStyleLightContent     NS_ENUM_AVAILABLE_IOS(7_0) = 1, // 白字旗扑,適用于深色背景
    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,// 白字(iOS6及以下系統(tǒng)在啟動(dòng)界面為灰底白字慈省,iOS7及以上系統(tǒng)與UIStatusBarStyleBlackOpaque效果一樣)
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,// 白字,適用于深色背景(iOS6及以下系統(tǒng)狀態(tài)欄為黑底白字)
} __TVOS_PROHIBITED;

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

隱藏狀態(tài)欄

[UIApplication sharedApplication].statusBarHidden = YES;

7.調(diào)用系統(tǒng)功能
openURL是UIApplication中一個(gè)非常強(qiáng)大的方法袱衷,使用其可以調(diào)用系統(tǒng)相關(guān)功能笑窜。其方法有

 - (BOOL)openURL:(NSURL*)url ;
 - (BOOL)canOpenURL:(NSURL *)url ;

[注]在iOS10后新增- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion方法

常用方法有:

(1)發(fā)送電子郵件

 NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
 NSString *body =@"&body=It is raining in sunny California!";
 NSString *email = [NSString  stringWithFormat:@"%@%@", recipients, body];
 email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:email]];

(2)打電話

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"tel://1234567890"]];

(3)發(fā)送短信

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms://466453"]];

(4)打開一個(gè)網(wǎng)址

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];

[補(bǔ)充] 打開網(wǎng)址的操作通常用于跳轉(zhuǎn)app store怖侦,iOS給好評(píng)時(shí)一般會(huì)直接打開app store應(yīng)用詳情界面,其實(shí)也可以直接跳轉(zhuǎn)到評(píng)論頁(yè)面搬葬,更有利于引導(dǎo)用戶打分和評(píng)論艳悔。(將下面id改成自己的app id即可)

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=id1128294199&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"]];

直接跳轉(zhuǎn)到詳情

https://itunes.apple.com/cn/app/jia-zhang-mu-ke/id1128294199?mt=8

8.推送相關(guān)
注冊(cè)推送

 [[UIApplication sharedApplication]registerUserNotificationSettings:setting];

移除推送

 [[UIApplication sharedApplication] cancelAllLocalNotifications];

添加推送

 [[UIApplication sharedApplication]  scheduleLocalNotification:notification];

更多內(nèi)容會(huì)陸續(xù)補(bǔ)充猜年,歡迎參考指正。

文章參考:
1.UIApplication深入研究-博客園
2.iOS開發(fā)UI篇—程序啟動(dòng)原理-博客園

文章優(yōu)先發(fā)表于:http://keyliu.com
轉(zhuǎn)載請(qǐng)注明出處乔外。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杨幼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子四瘫,更是在濱河造成了極大的恐慌欲逃,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洗做,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡邪码,警方通過查閱死者的電腦和手機(jī)咬清,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門旧烧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画髓,“玉大人,你說我怎么就攤上這事夺谁∪馕ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵勿负,是天一觀的道長(zhǎng)劳曹。 經(jīng)常有香客問我,道長(zhǎng)锭硼,這世上最難降的妖魔是什么蜕劝? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任熙宇,我火速辦了婚禮,結(jié)果婚禮上烫止,老公的妹妹穿的比我還像新娘。我一直安慰自己期升,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布颂郎。 她就那樣靜靜地躺著容为,像睡著了一般。 火紅的嫁衣襯著肌膚如雪替劈。 梳的紋絲不亂的頭發(fā)上得滤,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天懂更,我揣著相機(jī)與錄音,去河邊找鬼沮协。 笑死慷暂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呜呐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼洋魂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衔肢,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤豁翎,失蹤者是張志新(化名)和其女友劉穎心剥,沒想到半個(gè)月后背桐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝉揍,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杖刷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖不瓶,靈堂內(nèi)的尸體忽然破棺而出灾杰,到底是詐尸還是另有隱情,我是刑警寧澤麦备,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布昭娩,位于F島的核電站,受9級(jí)特大地震影響呛梆,放射性物質(zhì)發(fā)生泄漏磕诊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一滞磺、第九天 我趴在偏房一處隱蔽的房頂上張望莱褒。 院中可真熱鬧,春花似錦沛励、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谅摄,卻和暖如春送漠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闽寡。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工爷狈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人思币。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓羡微,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親各墨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子启涯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理结洼,服務(wù)發(fā)現(xiàn),斷路器松忍,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 寫作原因:網(wǎng)上看了很多推送文章都沒有完美的解答我的疑惑;主要有以下兩點(diǎn)宏所,1:推送來了我點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入應(yīng)用怎么取到...
    Thebloodelves閱讀 4,494評(píng)論 26 71
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 閱讀 能營(yíng)造一種安穩(wěn)的氣氛充石,對(duì)于我這種 喜愛逃避現(xiàn)實(shí)的人來說如同氧氣一樣重要霞玄。 中產(chǎn)階級(jí) 的認(rèn)知中理論的地位高于實(shí)...
    卡拉馬佐夫閱讀 359評(píng)論 0 0
  • 《外科風(fēng)云》終于大結(jié)局了惫企,故事結(jié)局以皆大歡喜收?qǐng)觥_@部劇里觸動(dòng)我的兩個(gè)角色不是男主莊恕大夫和女主陸晨曦大夫狞尔,而是...
    林恩慈Karen閱讀 1,204評(píng)論 0 3