分享一下本身ios開發筆記


// ********************** 推斷數組元素是否爲空 **********************html

NSString *element = [array objectAtIndex:2];ios

if ((NSNull *)element == [NSNull null]) {web

}算法

今天作項目的時候就遇到。要推斷數組元素是否爲空,個人下面寫法,都無效json

if(!element)數組

if([element length]>0)xcode

if(element== NULL)緩存

if(element == Nil)網絡

// **********************  託付的格式 **********************架構

1 定義協議

@protocol uploadUserInfoDelegate <NSObject>

@required

-(void)uploadCallBack:(NSInteger )code msg:(NSString *)msg;

@end

2 定義託付屬性

@property (nonatomic, weak) id<uploadUserInfoDelegate> delegate;

3 調用

if ([self.delegate respondsToSelector:@selector(uploadCallBack:msg:)]) {

[self.delegate uploadCallBack:111 msg:@"mmm"];

}


4 實現方遵循協議 傳遞託付對象實現協議方法

@interface ViewController () <uploadUserInfoDelegate>

obj.delegate = self;

-(void)uploadCallBack:(NSInteger )code msg:(NSString *)msg;


// **********************  block格式 **********************

1. 直接定義成屬性

@property (copy, nonatomic) void (^submitUserInfoBlock)(NSString* gender, NSInteger age, NSString* hobbys);

2. typedef定義成類型 方便傳參

typedef void (^Callback)(NSInteger code, NSString* msg);

- (void)uploadUserInfoWith:(NSString*)name callBack:(Callback) callback;

3. typedef 定義類型 再合成屬性

typedef void(^headerInputBlock)(NSString *inputStr);

@property(nonatomic,copy)headerInputBlock inputBlock;

4. 直接定義Block形參

- (AFHTTPRequestOperation *)httpGetWithMethodName:(NSString *) methodName

param:(id)parameters

response:(void (^)(id dict,NSError *error))callback;


// **********************  建立單例 **********************

+ (ViewController *)shared

{

static ViewController* instance;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [[ViewController alloc] init];

});

return instance;

}


// **********************  block 中的weakself **********************

block對於其變量都會造成strong reference。對於self也會造成strong reference,而假設self自己對block也是 strong reference的話,就會造成 strong reference 循環,形成內存泄露。爲了防止這樣的狀況發生。在block外部應該建立一個week__block reference

因此在block內假設有self的話,通常都會在block外面加一句_block typeof(self)weakself = self;

__block typeof(self) weakself = self;

[self methodThatTakesABlock:^ {

[weakself doSomething];

}

// ********************** 類別的使用category可以擴展系統類和本身定義類**********************

1. 新建類別文件NSString+Util

2.加入方法

@interface NSString (Util)


- (void)hello;

+ (void) say;


@end


3.實現方法

#import "NSString+Util.h"

@implementation NSString (Util)


- (void)hello {

NSLog(@"hello");

}


+ (void)say {

NSLog(@"static say.");

}


@end


4.在其餘類中導入並調用


#import "NSString+Util.h"

NSString* mm =  @"aa";

[mm hello];

[NSString say];


// *****************************   獲取系統時間的時分秒    *****************************

NSDate *now = [[NSDate alloc] init];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

//設定時間格式,這裏可以設置成本身需要的格式

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString* dateString =  [dateFormatter stringFromDate:now];



// *****************************   定義宏weakSelf    *****************************

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;



// *****************************   ViewController的代碼分組    *****************************

#pragma mark - Getters and Setters

#pragma mark - Init and Dealloc

#pragma mark - ViewController Lifecycle

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

#pragma mark - CustomDelegate

#pragma mark - Custom View

#pragma mark - View Event

#pragma mark -  Event Response

#pragma mark - GestureRecognizer

#pragma mark - Private Methods



// *****************************   xcode 實用的 tips    *****************************

//  TODO: 推斷登錄狀態,假設沒有登陸,顯示登陸界面。

//  FIXME: 推斷登錄狀態,假設沒有登陸,顯示登陸界面

//  ???: How does this work?

// !!!: Verify that all objects are accounted for

#warning This selector will not fire unless…


// *****************************   xcode @synthesize何時不本身主動合成    *****************************

同一時候重寫了settergetter

重寫了僅僅讀屬性的getter

使用了@dynamic

@protocol 中定義的所有屬性

category 中定義的所有屬性

重載的屬性

除了後三條,對其它幾個咱們可以總結出一個規律:當你想手動管理@property的所有內容時,你就會嘗試經過實現@property的所有存取方法the accessor methods)或者使用@dynamic來達到這個目的。這時編譯器就會以爲你打算手動管理@property,因而編譯器就禁用了autosynthesis(本身主動合成)

當你同一時候重寫了settergetter時,系統就不會生成ivar(實例變量/成員變量)。這時候有兩種選擇:

1.手動建立ivar

2.使用@synthesize foo = _foo;,關聯@propertyivar



// *****************************   UIToolBar   *****************************

1.工具欄UIToolBar管理了一組UIBarButtonItem

UIBarButtonItem不能任意擺放在屏幕上,它不是繼承自UIView

它由導航欄,標籤欄或工具欄管理。

欄button條目UIBarButtonItem存儲工具欄和導航欄的button的屬性。它自己不是button。


2. UIBarButtonItem有兩種類型:button元素。空白元素。

UIBarButtonSystemItem枚舉表示着不一樣的系統預設UIBarButtonItem;

UIBarButtonSystemItemFixedSpace類型表示一段空白,需要設置它的寬度值;可以使用它替換需要隱藏的項,以保持位置不變;

UIToolBar開頭和末尾加入UIBarButtonSystemItemFlexibleSpace會使其餘項有不一樣有水平對齊方式;

3.

初始化一個用於控制間距的UIBarButtonItem實例negativeSpacer,並設置negativeSpacerwidth屬性的值。設爲-5的時候。正好可以使button與屏幕邊界值爲0

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]

initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace

target:nil action:nil];

/**

*  width爲負數時,至關於btn向右移動width數值個像素,由於button自己和邊界間距爲5pix。因此width設爲-5時,間距正好調整

0width爲正數時,正好相反,至關於往左移動width數值個像素

*/

negativeSpacer.width = -5; 


leftItemsSupplementBackButton 設置是否僅僅顯示你本身定義的Backbuttuon默認NO 顯示本身定義的


// *****************************   Category   *****************************

、實現類別


同實現類類似,實現方法就能夠


2類別的侷限性


1.類別不能加入新的實例變量


2.命名衝突。假設類別中方法和類中已有方法同名,則類別具備更高優先級


3 類別的做用


1.將類的實現分散到多個不一樣文件或多個不一樣框架中


2.建立私有方法的前向引用


3.向對象加入非正式協議


4 利用類別分散實現


利用類別可以將類的方法分散到多個源文件裏


特別指出的是:類別可以訪問其繼承的類的實例變量


在使用一個方法時,對象的方法是在接口中聲明、父類中聲明、仍是類別中聲明並不重要


類別不只可以分散實現到不一樣源文件,也可跨框架


5使用類別建立前向引用


儘管可以實現未聲明的方法,但是編譯器會提出警告


經過類別可以提供聲明。而且,聲明的方法沒必要要必定在類別的實現中實現,也可以在類的實現中實現


6非正式協議和託付類別


託付(delegage)是一種對象。還有一個類的對象會要求託付對象運行它的某些操做


託付對象接受其餘對象對它的特定方法的調用


事實上就是託付對象必須實現別的對象調用的方法,與接口相似


7 ITunesFinder項目


8 、託付和類別


託付和類別有什麼關係?託付強調類別的還有一種應用:被髮送給託付對象的方法可以聲明爲一個NSObject的類別


建立一個NSObject的類別稱爲建立一個非正式協議


9響應選擇器


選擇器僅僅是一個方法名稱,可以使用@selector()預編譯指令指定選擇器,當中方法名位於圓括號裏,但它以OC執行時使用的特殊方式編碼,以高速執行查詢


NSObject提供了一個respondsToSelector的方法,詢問對象以肯定其是否實現某個特定消息


10選擇器的其它應用


選擇器可以被傳遞,可以做爲方法參數。甚至可以做爲實例變量存儲



// *****************************   NSIndexPath   *****************************

1. indexPath.row 適用TableView

2. indexPath.item 適用於CollectionView

3. 設置UITableViewStyleGrouped可以讓headerfootertableview一塊兒滾動


// *****************************   navigationBar and  navigationItem    *****************************

self.navigationItem.leftBarButtonItem = nil;    //隱藏導航欄回退item

self.navigationController.navigationBar.hidden = YES;   //隱藏整個導航欄

// *****************************   Masonry    *****************************

Masonry             NSAutoLayout                   說明

left                NSLayoutAttributeLeft          左側

top                 NSLayoutAttributeTop           上側

right               NSLayoutAttributeRight         右側

bottom              NSLayoutAttributeBottom        下側

leading             NSLayoutAttributeLeading       首部

trailing            NSLayoutAttributeTrailing      尾部

width               NSLayoutAttributeWidth         

height              NSLayoutAttributeHeight        

centerX             NSLayoutAttributeCenterX       橫向中點

centerY             NSLayoutAttributeCenterY       縱向中點

baseline            NSLayoutAttributeBaseline      文本基線


// *****************************   instancetype - id    *****************************

instancetype可以返回和方法所在類一樣類型的對象。id僅僅能返回未知類型的對象;

instancetype僅僅能做爲返回值,不能像id那樣做爲參數



// *****************************   tableView 動態Cell    *****************************

{

    BOOL cellIsSelected;

    NSIndexPath* _indexPath;

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{


UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];


if ([cell isSelected] && cellIsSelected == NO) {

cellIsSelected = YES;

_indexPath = indexPath;

} else {

cellIsSelected = NO;

}



[tableView beginUpdates];

[tableView endUpdates];


}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {


if(cellIsSelected && _indexPath.row == indexPath.row) {

return 50 * 2.0;

}

return 50;

}


// *****************************  ios 異常崩潰 處理    *****************************


使用第三方庫 UncaughtExceptionHandler

可以檢測出常見錯誤,並友好的提示用戶 好比


1.NSArrayNSDictionaryNSStringKVC等問題引發的閃退。

2.解決NSObject performSelector找不到selector引發的閃退。


用法:

1、首先需要在appDelegate中使用InstallUncaughtExceptionHandler()用於監聽

2、加入UncaughtExceptionHandler這個類


iOS SDK提供的函數是NSSetUncaughtExceptionHandler來進行異常處理。但是沒法處理內存訪問錯誤、反覆釋放等錯誤,因爲這些錯誤發送的SIGNAL。因此需要處理這些SIGNAL


4. SignalHandler不要在debug環境下測試。因爲系統的debug會優先去攔截。

咱們要執行一次後,關閉debug狀態。應該直接在模擬器上點擊咱們build上去的app去執行。而UncaughtExceptionHandler可以在調試狀態下捕捉



// *****************************  指針和引用的差異   *****************************

1. 引用在語言內部用指針實現(怎樣實現?)。

2. 對通常應用而言。把引用理解爲指針,不會犯嚴重語義錯誤。

3. 引用是操做受限了的指針(僅允許取內容操做)



// *****************************  iOS 集合的深複製與淺複製   *****************************

1. 在非集合類對象中:對immutable對象進行copy操做,是指針複製,mutableCopy操做時內容複製;對mutable對象進行copymutableCopy都是內容複製。

用代碼簡單表演示樣例如如下:


[immutableObject copy] // 淺複製

[immutableObject mutableCopy] //深複製

[mutableObject copy] //深複製

[mutableObject mutableCopy] //深複製


2. 在集合類對象中,對immutable對象進行copy,是指針複製,mutableCopy是內容複製;對mutable對象進行copymutableCopy都是內容複製。但是:集合對象的內容複製僅限於對象自己,對象元素仍然是指針複製。

用代碼簡單表演示樣例如如下:


[immutableObject copy] // 淺複製

[immutableObject mutableCopy] //單層深複製

[mutableObject copy] //單層深複製

[mutableObject mutableCopy] //單層深複製


// **********  ios目錄:Documents, Library tmp Library包括CachesPreferences文件夾 **************

Documents:蘋果建議將程序建立產生的文件以及應用瀏覽產生的文件數據保存在該文件夾下。iTunes備份和恢復的時候會包含此文件夾

Library:存儲程序的默認設置或其餘狀態信息。

Library/Caches:存放緩存文件,保存應用的持久化數據,用於應用升級或者應用關閉後的數據保存。不會被itunes同步,因此爲了下降同步的時間,可以考慮將一些比較大的文件而又不需要備份的文件放到這個文件夾下。

tmp:提供一個即時建立暫時文件的地方。但不需要持久化。在應用關閉後,該文件夾下的數據將刪除,也可能系統在程序不執行的時候清除。


1Documents文件夾


  您應該將所有的應用程序數據文件寫入到這個文件夾下。

  這個文件夾用於存儲用戶數據或其餘應該按期備份的信息。

  保存由應用程序產生的文件或者數據,好比:塗鴉程序生成的圖片,遊戲關卡記錄

  iCloud會本身主動備份Document中的所有文件。

  上架注意 假設保存了從網絡上下載的文件,在上架審批的時候會被拒!


2AppName.app文件夾:這是應用程序的程序包文件夾,包括應用程序的自己。

由於應用程序必須通過簽名,因此您在執行時不能對這個文件夾中的內容進行改動。不然可能會使應用程序沒法啓動。


3Library文件夾:這個文件夾下有兩個子文件夾:Caches Preferences


  Preferences 文件夾:包括應用程序的偏好設置文件。

您不該該直接建立偏好設置文件。而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.


    系統偏好,用戶偏好。經過[NSUserDefaults standarDefaults]來直接操做


  Caches 文件夾:用於存放應用程序專用的支持文件,保存應用程序再次啓動過程當中需要的信息。

    緩存。保存網絡下載的文件。興許仍然需要繼續使用。好比:網絡下載的離線數據

    緩存文件夾中的文件系統不會本身主動刪除,可作離線訪問

    程序必需要提供一個無缺的清除緩存文件夾的解決方式


4tmp文件夾:用於存放暫時文件(暫時數據),保存應用程序再次啓動過程當中不需要的信息。

  暫時文件,保存在tmp中的文件,系統會本身主動回收,譬如磁盤空間緊張、又一次啓動手機、應用退出後刪除

  程序猿不需要管tmp目錄的釋放



// *****************************  UIApplication  openURL  *****************************

1.設置icon上的數字圖標

//設置主界面icon上的數字圖標。在2.0中引進,缺省爲0

[UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

2.設置搖動手勢的時候。是否支持redo,undo操做

//搖動手勢。是否支持redo undo操做。

//3.0之後引進,缺省YES

[UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;


3.推斷程序執行狀態

//推斷程序執行狀態,在2.0之後引入

/*

UIApplicationStateActive,

UIApplicationStateInactive,

UIApplicationStateBackground

*/

if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){

NSLog(@"程序在執行狀態");

}


4.阻止屏幕變暗進入休眠狀態

//阻止屏幕變暗。謹慎使用,缺省爲no 2.0

[UIApplicationsharedApplication].idleTimerDisabled =YES;

謹慎使用本功能。因爲很耗電。

5.顯示聯網狀態

//顯示聯網標記 2.0

[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;


6.map上顯示一個地址

NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";

// URL encode the spaces

addressText =  [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];


[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];


7.發送電子郵件

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 = [NSStringstringWithFormat:@"%@%@", recipients, body];

email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];


8.打電話到一個號碼


// Call Google 411

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

9.發送短信

// Text to Google SMS

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

10.打開一個網址


// Lanuch any iPhone developers fav site

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];





// *****************************  AFNetWorking https SSL認證   *****************************






// *****************************  ios File IO *******************************


數組、字典僅僅能將BOOLNSNumberNSStringNSDataNSDateNSArrayNSDictionary寫入屬性列表plist文件

NSFileHandle類主要對文件內容進行讀取和寫入操做

NSFileManager類主要對文件的操做(刪除、改動、移動、複製等等)



// *****************************  載入本地html *******************************


- (void)loadExamplePage:(UIWebView*)webView {

NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];

NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];

NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];

[webView loadHTMLString:appHtml baseURL:baseURL];

}



- (void)loadDocument:(NSString*)docName {

NSString* path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];

NSURL *url = [NSURL fileURLWithPath:path];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

self.webView.scalesPageToFit = YES;

[self.webView loadRequest:request];

}


// *****************************  UIScrollView裏面嵌套UITableView這樣的結構是否合理? *******************************

Q: 相似網易新聞和lofter這樣的多標籤滾動切換的效果,我覺得是在scrollview上加入tableview來實現的,但這樣實現感受會致使ViewController臃腫不堪,實現delegatedatasource也比較混亂;想聽聽你們對於架構這樣的界面有什麼樣的建議,能提升代碼的複用還有把代碼剝離放到合適的地方;真的好想寫出結構清晰美觀的代碼啊思密達!


A: 每個標籤相應的列表可以是一個viewController。它負責這個列表的內容和一切的交互。

scrollView裏裝的是viewController.view

scrollView所在的viewController可以稱之爲containerViewController,實際上起到了NavigationController之類的容器做用。而詳細的內容。可以稱之爲contentViewController

它的優勢:


同一個contentVC可以在不一樣的容器中自由地拆下和裝上。減小耦合,或者如題主所說能提升代碼的複用還有把代碼剝離放到合適的地方

可以作到動態地調整contentVC的數量,樣式也可以各不一樣樣,僅僅要是vc就能夠。題主圖中的網易新聞無疑是這麼作的佼佼者

可以經過兩塊木板過河這種原理。使用三個view來做爲contentVCscrollView的中間層。作到不論有多少個contentVC(比方網易新聞中加入很是多標籤),同一時候載入在scrollView上的都僅僅有3

確定還有,我一時沒想到。

。。

總的來講,這樣的結構可以稱得上清晰美觀,但也要看實現者的水準,作得很差反而會帶來很是多問題。作得好的。。。你看網易新聞多好用:)





/*************************** 動態口令 ****************************/

每次認證時令牌與server分別依據相同的密鑰。相同的隨機數和相同的算法計算出認證時的動態口令,


動態password的password事實上不是隨機的,而是由規律的。當下動態password分爲兩類,時間性和事件性。何爲時間性動態password?該類令牌產出動態password是以時間爲參數的。而事件性通常以使用次數爲參數的。咱們以時間性動態爲主要說明對象。整個驗證的步驟例如如下:


1.動態password令牌產生動態password以時間和種子爲參數,進行迭代,得出動態password,這裏的時間一般是秒數。

每個時間性動態password令牌中會內置一個時鐘芯片。

2.server校驗動態password。server讀取系統時間加上種子。以一樣的迭代方法得出動態password,而後兩方進行比對。

說到這邊。可能有所懷疑難道令牌的時間和server的時間必定會一致嗎?個人答案確定是不一致的。那怎麼能檢驗的過去呢?原來很是easy,server校驗是是在一個時間區間裏校驗的,比方現在是1200,server會生成1155-1205中所有的動態password,而後和令牌產生的動態password比對。這樣不就攻克了時間不一致的問題了。另外server會把令牌和server相差的時間記錄下來,下次檢驗的會先把這個偏移值記錄下來,以下降動態password迭代次數,這樣就完畢了另一個比較重要的功能,偏移值本身主動調整。




顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles  YES

隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles  NO

輸完單擊Enter鍵,退出終端。又一次啓動Finder就可以了

從新啓動Finder:鼠標單擊窗體左上角的蘋果標誌-->強制退出-->Finder-->又一次啓動





/*************************** title使用self.navigationItem.title ****************************/

Q:樓主有沒有試過,在ViewDidLoad方法中,對self.titleself.navigationItem.title分別進行設置,出現的效果是同樣的?

A: 設置self.title會設置導航title,但是假設如下有tabBar,也會設置tabBarItemtitle,因此仍是單獨設置好一些,導航title使用self.navigationItem.title


/*************************** iOS6之後UILabel顯示不一樣的字體和顏色 ****************************/


NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String"];

[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(6,12)];

[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(19,6)];

[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial-BoldItalicMT" size:30.0] range:NSMakeRange(0, 5)];

[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:10.0] range:NSMakeRange(6, 12)];

[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(19, 6)];

self.attrLabel.attributedText = str;





/*************************** xcode中的project.pbxproj衝突怎麼解決 ****************************/

1 加入或修改文件佈局時先更新,改完後要立刻提交,團隊成員都遵守這個約定。

/*************************** translucent  IOS7 導航欄是不是半透明設置,子視圖是否從屏幕 0, 0開始 ****************************/

self.navigationController.navigationBar.translucent = NO;


/*************************** 保持程序在後臺長時間執行 ****************************/

iOS上的VOIP程序是確定能後臺監測到來電並提示用戶的

VOIPSIP報文走的是TCP通道,而語音報文走的是UDP通道。

iOS平臺中。NSStream即爲TCP,並且NSStream有一個VOIP屬性,假設設置了,那麼你的程序處於後臺時候,系統會託管你這個NSStream通道。並保持和server鏈接的暢通,假設這個時候server經過這個NSSreamTCP socket)給client發送了數據,系統會激活你處於後臺的程序執行10秒鐘已處理這個報文,你可以在這個時候經過LocalNotification來提示用戶有來電。



/*************************** 動態計算文字的高度 ****************************/

NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:16.0]}


CGSize size = [content boundingRectWithSize:CGSizeMake(UI_SCREEN_WIDTH, CGFLOAT_MAX) o

ptions: NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;


/*************************** 打開其餘app ****************************/

使用[[UIApplication sharedApplication] canOpenURL:instagramURL];來推斷是否已安裝該APP,

使用[[UIApplication sharedApplication] openURL:fansPageURL];來打開該APP,若未安裝, 則默認在safari中打開對應頁面.


1. source app

NSURL *sourcePageURL;

sourcePageURL = [NSURL URLWithString:[NSString stringWithFormat:@"joejoe://%@", @"aaa"]]; //不能有空格

[[UIApplication sharedApplication] openURL:sourcePageURL];


2.target app

2.1 taget->info->URL Types->URL Schemes設置namembc2m

// 獲取發送過來的值

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

    NSString* str =  [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

}


/**************************** 模擬用戶觸發事件 **************************/

UIControl有一個sendActionsForControlEvents消息,可以使用它手動觸發控件事件:

[button sendActionsForControlEvents:UIControlEventTouchUpInside]

[button sendAction:<#(nonnull SEL)#> to:<#(nullable id)#> forEvent:<#(nullable UIEvent *)#>]




/********************* 編碼問題致使NSURL初始化一直爲null的解決的方法設置utf8編碼 **********************/

NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


/********************* NSDictionaryjson str **********************/

- (NSString *)toJSONorNSString:(id )o

{


NSData *data=[NSJSONSerialization dataWithJSONObject:o options:NSJSONReadingMutableLeaves|NSJSONReadingAllowFragments error:nil];


if (data == nil) {


return nil;

}



NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


return str;

}




/*****************************     MVVM      ******************************/

MVC的基礎上。把C拆出一個ViewModel專門負責數據處理的事情。就是MVVM。而後,爲了讓ViewViewModel之間能夠有比較鬆散的綁定關係,因而咱們使用ReactiveCocoa。因爲蘋果自己並無提供一個比較適合這樣的狀況的綁定方法。iOS領域裏KVONotificationblockdelegatetarget-action均可以用來作數據通訊。從而來實現綁定。但都不如ReactiveCocoa提供的RACSignal來的優雅。假設不用ReactiveCocoa,綁定關係可能就作不到那麼鬆散那麼好。但並不影響它仍是MVVM



/*****************************    數組不轉化成實體類的優勢     ******************************/

數組內容的轉化成本較高:數組裏面每項都要轉化成Item對象,假設Item對象中還有相似數組,就很是頭疼。

轉化以後的數據在大部分狀況是不能直接被展現的。爲了能夠被展現,還需要第二次轉化。

僅僅有在API返回的數據高度標準化時,這些對象原型(Item)的可複用程度才高,不然easy出現類型爆炸。提升維護成本。

調試時經過對象原型查看數據內容不如直接經過NSDictionary/NSArray直觀。

同一API的數據被不一樣View展現時,難以控制數據轉化的代碼,它們有可能會散落在不論什麼需要的地方。

相關文章
相關標籤/搜索