你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> (iOS開發進階) 干貨匯總

(iOS開發進階) 干貨匯總

編輯:IOS開發綜合

 


10.1.3 不要向已經釋放的對象發送消息


有些讀者想測試當對象釋放時, 其retainCount 是否變為了0, 他們的試驗代碼如下: (記得要在Appdelegate.m 中 設置為MRC -fno-objc-arc)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
    NSObject *object = [[NSObject alloc] init];
    NSLog(@Reference Count = %u, [object retainCount]);
    
    [object release];
    NSLog(@Reference Count = %u, [object retainCount]);
    return YES;
}
// 打印結果
// 2015-01-21 10:04:05.799 MRC_Test[2985:607] Reference Count = 1
// 2015-01-21 10:04:05.800 MRC_Test[2985:607] Reference Count = 1

我們注意到, 最後一次輸出, 引用計數沒有變成0。因為該對象的內存已經被回收,而我們向一個已經被回收的對象發一個retainCount消息,所以它的輸出結果應該是不確定的,如果該對象所占的內存被復用了,那麼就有可能造成程序異常崩潰。那為什麼這個對象被回收之後,這個不確定的值是1而不是0呢。這是因為當最後一次執行release時,系統知道馬上就要回收內存了。就沒有必要再將retainCount減1了,因為不管減不減1,該對象都肯定會被回收。而對象被回收後,它的所有內存區域,包括retainCount值也變得沒有意義。不將這個值從1變為0,可以減少一次內存的操作,加速對象的回收。

使用GCD後


/





11.2.4 後台運行


使用block的另一個用處是可以讓程序在後台較長久地運行。在以前, 當應用被按Home鍵退出後,應用僅有最多5秒鐘的時間做一些保存或清理資源的工作。但是應用可以調用UIApplication 的 beginBackgroundTaskWithExpirationHandler方法,讓應用最多有10分鐘的時間在後台長久運行。這個時間可以用來做清理本地緩存,發送統計數據等工作。
// Appdelegate.h
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// Appdelegate.m
launchOptions
{
    // Override point for customization after application launch.
    return YES;
}
							
- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    
    [self beginBackgroundUpdateTask];
    
    //在這裡添加需要長久運行的代碼
    
    [self endBackgroundUpdateTask];
}



- (void)beginBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}




15.7 使用Safari進行調試


//

/

 

 

 

 

18.2.2 收起鍵盤

 

在UIViewController中收起鍵盤, 除了調用相應控件的resignFirstResponder 方法外, 還有另外三種辦法:

1. 重載 UIViewController 中的 touchesBegin方法, 然後在裡面執行 [self.view endEdiiting: YES]; 這樣單擊UIViewController的任意地方, 就可以收起鍵盤。

2. 直接執行[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to: nil from: nil forEvent: nil]; 用於在獲得當前UIViewController比較困難的時候用。

3. 直接執行 [[[UIApplication sharedApplication] keyWindow] endEditing: YES]

 

 

18.2.4 設置應用內的系統控制語言

 

 

在iOS應用中, 有時候會需要調用系統的一些UI控件, 例如:

1. 在UIWebView中長按彈出系統的上下文菜單。

2. 在UIImagePickerController中會使用系統的照相機界面。

3. 在編譯狀態下的UITableViewCell, 處於待刪除狀態時, 會有一個系統的刪除按鈕。

 

以上這些UI控件, 其顯示的語言並不是和你當前手機的系統語言一致, 而是根據你的應用內部的語言設置來顯示。

 

在 info.plist文件中, 增加:

CFBundleLocalizations zh_CN

 

 

18.2.9 忽略編譯警告

 

 

使用-w禁止掉所有的編譯警告, 用-Wno-unused-variable 只禁止未使用變量的編譯警告。

(用法和 -fno-objc-arc 一樣)

 

 

18.4.3 給模擬器相冊增加圖片

 

 

... 直接把圖片拖放到模擬器中, 會利用Safari打開, 然後保存即可。

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved