ios的代碼小tips

三元條件表達(dá)式的兩元使用

1> 使用格式

表達(dá)式A ? 表達(dá)式B : 表達(dá)式C

2> 運(yùn)算結(jié)果

如果表達(dá)式A成立半哟,也就是為“真”,條件運(yùn)算符的結(jié)果就是表達(dá)式B的值签餐,否則寓涨,就為表達(dá)式C的值

3> 三元條件表達(dá)式?:是C中唯一一個(gè)三目運(yùn)算符,用來(lái)替代簡(jiǎn)單的if-else語(yǔ)句氯檐,同時(shí)也是可以?xún)稍褂玫?/p>

!self.completion ?: self.completion(self.userInfo);

等同于

if(self.completion){
    self.completion(self.userInfo);
}

括號(hào)中的復(fù)合語(yǔ)句

A compound statement enclosed in parentheses 來(lái)自gnc的解釋
源代碼定義:

RETURN_VALUE_RECEIVER = {(
        // your code

       RETURN_VALUE; // 返回值
)};

*下面是一些例子

例子1:
   self.tempBtn = ({
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.frame = CGRectMake(100, 100, 50, 50);
        [button setTitle:@"測(cè)試" forState:UIControlStateNormal];
        button;
    });

例子2:
 // 添加myTableView
    _myTableView = ({
        
        UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        
        tableView.backgroundColor = [UIColor clearColor];
        tableView.dataSource = self;
        tableView.delegate = self;
        tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        [tableView registerClass:[TweetCell class] forCellReuseIdentifier:kCellIdentifier_Tweet];
        [self.view addSubview:tableView]
        tableView;
    });

Note:
1.它最大的意義在于將代碼整理分塊戒良,將同一個(gè)邏輯層級(jí)的代碼包在一起
2.同時(shí)對(duì)于一個(gè)無(wú)需復(fù)用小段邏輯,也免去了重量級(jí)的調(diào)用函數(shù),
3.返回值和代碼塊結(jié)束點(diǎn)必須在結(jié)尾

RAC 倒計(jì)時(shí)

#define kMaxLimitCount 10
    @weakify(self);
    __wea NSInteger number = 0;
    RACSignal *timer = [[[RACSignal interval:1.0f onScheduler:[RACScheduler mainThreadScheduler]] map:^id _Nullable(NSDate * _Nullable value) {
        @strongify(self);
        if (--number <= 0) {
            [self.goBackBtn setTitle:@"獲取驗(yàn)證碼" forState:UIControlStateNormal];
            return @YES;
        }else{
            [self.goBackBtn setTitle:[NSString stringWithFormat:@"%d秒后可重新獲取", (int)number] forState:UIControlStateNormal];
            return @NO;
        }
    }] takeUntilBlock:^BOOL(id  _Nullable x) {
        return number <= 0;
    }];
    
    self.goBackBtn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        number  = kMaxLimitCount;
        return timer;
    }];

隨機(jī)數(shù)

1.獲取一個(gè)隨機(jī)整數(shù)范圍在:[0,10)包括0冠摄,不包括10

int a = arc4random() % 100;

2.獲取一個(gè)隨機(jī)數(shù)范圍在:[10,20]糯崎,包括10几缭,包括20

int b =10 +  (arc4random() % 10);

轉(zhuǎn)------>生成不重復(fù)隨機(jī)數(shù)
思想:其原理就是利用兩個(gè)數(shù)組,第一個(gè)數(shù)組存放要隨機(jī)的原始數(shù)據(jù)沃呢,第二個(gè)數(shù)組存放結(jié)果年栓;然后arc4random產(chǎn)生一個(gè)隨機(jī)數(shù),將這個(gè)隨機(jī)數(shù)用作下標(biāo)薄霜,把第一個(gè)數(shù)組對(duì)應(yīng)下標(biāo)的數(shù)據(jù)取出并刪除某抓。取出后存入第二個(gè)數(shù)組。然后循環(huán)往復(fù)就可以了惰瓜。即便兩次arc4random產(chǎn)生的隨機(jī)數(shù)是相同的否副,但第一個(gè)數(shù)組對(duì)應(yīng)下標(biāo)的數(shù)據(jù)卻是不一樣的 其實(shí)使用NSSet 也可以

兩個(gè)數(shù)組 code

-(NSArray *)randomArray  
{  
    //隨機(jī)數(shù)從這里邊產(chǎn)生  
    NSMutableArray *startArray=[[NSMutableArray alloc] initWithObjects:@0,@1,@2,@3,@4,@5,@6,@7, nil nil];  
    //隨機(jī)數(shù)產(chǎn)生結(jié)果  
    NSMutableArray *resultArray=[[NSMutableArray alloc] initWithCapacity:0];  
    //隨機(jī)數(shù)個(gè)數(shù)  
    NSInteger m=8;  
    for (int i=0; i<m; i++) {  
        int t=arc4random()%startArray.count;  
        resultArray[i]=startArray[t];  
        startArray[t]=[startArray lastObject]; //為更好的亂序,故交換下位置  
        [startArray removeLastObject];  
    }  
    return resultArray;  
} 

** NSSet code**

NSArray *array = [[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",nil];  
NSMutableArray *randomArray = [[NSMutableArray alloc] init];  
  
while ([randomArray count] < 3) {  
     int r = arc4random() % [array count];  
     [randomArray addObject:[array objectAtIndex:r]];  
} 

UILabel如何在XIB中換行

在Interface Builder中鸵熟,選中要換行的UILabel副编,在屬性面板中,選中文本框流强,輸入第一行文字,預(yù)要換行時(shí)呻待,按住Optional(Alt)+Enter打月,自動(dòng)切換到第二行,(如果直接按enter鍵蚕捉,則是確定輸入的內(nèi)容奏篙,不會(huì)自動(dòng)換行),同時(shí)別忘了將Lines屬性設(shè)置為0

2EE7F56C-672E-45C7-ACA1-AD4147249BF7.png

關(guān)于tableView樣式為UITableViewStyleGrouped間距的設(shè)置

開(kāi)始的時(shí)候迫淹,以為這樣寫(xiě)就搞定了 如下

        self.tableView.sectionHeaderHeight = 10;
        self.tableView.sectionFooterHeight = 0;

發(fā)現(xiàn)發(fā)現(xiàn)section=0 的時(shí)候高度并沒(méi)有變化

最后發(fā)現(xiàn)self.tableView.sectionHeaderHeight = 10;可以不用設(shè)置秘通,直接用代理的方法就可以,但是self.tableView.sectionFooterHeight = 0必須寫(xiě)敛熬。 并且如果寫(xiě)了self.tableView.sectionFooterHeight = 0之后肺稀,他的代理方法其實(shí)是不起作用的。簡(jiǎn)單來(lái)說(shuō)应民,就是只需實(shí)現(xiàn)下面的代碼

self.tableView.sectionFooterHeight = 0;

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 10;
}

上面的例子 是針對(duì)多個(gè)section的設(shè)置话原,如果只有一個(gè)section的話(huà),就比較簡(jiǎn)單了诲锹,直接設(shè)置tableHeadView就可以了

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 10.f)];

或者修改tableView的內(nèi)邊距 contentInset

self.tableView.contentInset = UIEdgeInsetsMake(xxx, 0, 0, 0);

如果是調(diào)節(jié)section之間的距離繁仁,就一起調(diào)整兩個(gè)屬性,如果是整體上移归园,就調(diào)節(jié)內(nèi)邊距屬性contentInset

__weak 和__block的區(qū)別

__weak 本身可以解決循環(huán)引用黄虱,但是出了block作用域之后,就訪問(wèn)不到這個(gè)對(duì)象了庸诱,可以在block里 聲明一個(gè)__strong 指向這個(gè)對(duì)象捻浦,這樣就可以使外部對(duì)象既能在 block 內(nèi)部保持住晤揣,又能避免循環(huán)引用的問(wèn)題
__block 本身無(wú)法避免循環(huán)引用的問(wèn)題,但是我們可以在 block 內(nèi)部手動(dòng)把 blockObj 賦值為 nil 的方式來(lái)避免循環(huán)引用的問(wèn)題默勾。另外一點(diǎn)就是 __block 修飾的變量在 block 內(nèi)外都是唯一的碉渡,要注意這個(gè)特性可能帶來(lái)的隱患

protocol里增加property

如果在protocol里定義了屬性,有兩種方法處理

  1. 就要在實(shí)現(xiàn)類(lèi)里面自己實(shí)現(xiàn)get和set方法母剥,Student遵守了協(xié)議滞诺,可以在Student的實(shí)現(xiàn)文件里這樣操作
    @synthesize yourProterry=_yourProterry;
  2. 在A的聲明文件里,重寫(xiě)這個(gè)屬性 例如
    in MyProtocal.h
@protocol MyProtocal <NSObject>
@property (nonatomic, copy) NSString *name;
@end

in Student.h

@interface Student : NSObject<MyProtocal>
@property (nonatomic, copy) NSString *name;

@end

其實(shí)protocol里增加property环疼,主要是為了抽代碼习霹,把公共的代碼抽出來(lái),對(duì)于model而言炫隶,有一些共有的屬性淋叶,可以寫(xiě)在協(xié)議里,有需要這些屬性的子model 直接遵守改協(xié)議即可伪阶,比較靈活煞檩。

使用webView 提交參數(shù)(提交表單時(shí))post方式

     NSURL *url = [NSURL URLWithString: @"你的網(wǎng)址"];
    NSString *body = [NSString stringWithFormat: @"參數(shù)1=%@&參數(shù)22=%@", @"val1",@"val2"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
    [request setHTTPMethod: @"POST"];
    [request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];
    [webView loadRequest: request];

tips連接參數(shù)時(shí)要用&

ARC下的assign和weak區(qū)別

The main difference between weak and assign is that the with weak, once the object being pointed to is no longer valid, the pointer is nilled out. Assigning the pointer the value nil avoids many crashes as messages sent to nil are essentially no-ops

Excerpt From: Daniel H Steinberg.

“Developing iOS 7 Apps for iPad and iPhone.” Dim Sum Thinking, Inc, 2014. iBooks. iTunes - Books

weak 比 assign 多了一個(gè)功能就是當(dāng)屬性所指向的對(duì)象消失的時(shí)候(也就是內(nèi)存引用計(jì)數(shù)為0)會(huì)自動(dòng)賦值為 nil ,這樣再向 weak 修飾的屬性發(fā)送消息就不會(huì)導(dǎo)致野指針操作crash栅贴。OC中向nil發(fā)消息斟湃,程序是不會(huì)崩潰的.
tips
在 ARC 模式下編程時(shí),指針變量一定要用 weak 修飾檐薯,只有基本數(shù)據(jù)類(lèi)型和結(jié)構(gòu)體需要用 assgin 凝赛,例如 delegate ,一定要用 weak 修飾
__unsafe_unretained:和__weak一樣坛缕,唯一的區(qū)別便是墓猎,對(duì)象即使被銷(xiāo)毀,指針也不會(huì)自動(dòng)置空赚楚, 此時(shí)指針指向的是一個(gè)無(wú)用的野地址毙沾。如果使用此指針,程序會(huì)拋出 BAD_ACCESS 的異常直晨。

理解__unsafe_unretained

__unsafe_unretained:和__weak 一樣搀军,唯一的區(qū)別便是,對(duì)象即使被銷(xiāo)毀勇皇,指針也不會(huì)自動(dòng)置空罩句, 此時(shí)指針指向的是一個(gè)無(wú)用的野地址。如果使用此指針敛摘,程序會(huì)拋出 BAD_ACCESS 的異常
examp1

id __unsafe_unretained obj = [[NSMutableArray alloc]init];  
[obj addObject:@"obj"];  

在第二條語(yǔ)句就會(huì)崩潰门烂,分析:
附有__unsafe_unretained修飾符的變量同附有__weak修飾符的變量一樣,因?yàn)樽约荷刹⒊钟械膶?duì)象不能繼續(xù)為自己持有,所以生成的對(duì)象會(huì)立即被釋放屯远。也就是說(shuō)在執(zhí)行完init方法以后蔓姚,obj指針?biāo)赶虻膬?nèi)存就已經(jīng)釋放掉了,可是obj指針并沒(méi)有像附加__weak的指針那樣慨丐,將指針自動(dòng)置為nil坡脐,它依然指向原來(lái)的地址,可是這塊地址的內(nèi)存已經(jīng)被系統(tǒng)回收了房揭,再訪問(wèn)就是非法的备闲,也就是野指針,再執(zhí)行后面的addObject方法自然會(huì)出錯(cuò)了捅暴。
也就是說(shuō)上面的代碼恬砂,把__unsafe_unretained換成__weak就不會(huì)崩潰,因?yàn)閛bj會(huì)自動(dòng)制置為nil蓬痒。對(duì)nil發(fā)送消息是不會(huì)有問(wèn)題的泻骤。
examp2

id __unsafe_unretained obj1 = nil;  
{  
    id  obj0 = [[NSMutableArray alloc]init];  
    [obj0 addObject:@"obj"];  
    obj1 = obj0;  
    NSLog(@"obj0 = %@", obj0);  
}  
  
NSLog(@"obj1 = %@", obj1); 

依然在最后的NSLog語(yǔ)句崩潰。分析:
因?yàn)?code>__unsafe_unretained既不強(qiáng)引用梧奢,也不弱引用狱掂,作用域外obj0強(qiáng)引用失效,并且沒(méi)有其他指針強(qiáng)引用這個(gè)對(duì)象亲轨,所以自動(dòng)釋放持有的對(duì)象符欠,obj1就相當(dāng)于野指針,訪問(wèn)野指針就會(huì)崩潰瓶埋;
也就是說(shuō),賦值給附有__unsafe_unretained修飾符變量的對(duì)象在通過(guò)該變量使用時(shí)诊沪,如果沒(méi)有確保其確實(shí)存在养筒,那么應(yīng)用程序就會(huì)崩潰;

UIView transitionFromView 實(shí)現(xiàn)反復(fù)3D旋轉(zhuǎn)效果

效果如下


CMSCoinView.gif
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^ __nullable)(BOOL finished))completion

記一下demo鏈接
文章鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末端姚,一起剝皮案震驚了整個(gè)濱河市晕粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渐裸,老刑警劉巖巫湘,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昏鹃,居然都是意外死亡尚氛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)洞渤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阅嘶,“玉大人,你說(shuō)我怎么就攤上這事⊙度幔” “怎么了抡蛙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魂迄。 經(jīng)常有香客問(wèn)我粗截,道長(zhǎng),這世上最難降的妖魔是什么捣炬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任熊昌,我火速辦了婚禮,結(jié)果婚禮上遥金,老公的妹妹穿的比我還像新娘浴捆。我一直安慰自己,他們只是感情好稿械,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布选泻。 她就那樣靜靜地躺著,像睡著了一般美莫。 火紅的嫁衣襯著肌膚如雪页眯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天厢呵,我揣著相機(jī)與錄音窝撵,去河邊找鬼。 笑死襟铭,一個(gè)胖子當(dāng)著我的面吹牛碌奉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寒砖,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赐劣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哩都?” 一聲冷哼從身側(cè)響起魁兼,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漠嵌,沒(méi)想到半個(gè)月后咐汞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儒鹿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年化撕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺身。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侯谁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墙贱,我是刑警寧澤热芹,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站惨撇,受9級(jí)特大地震影響伊脓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魁衙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一报腔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剖淀,春花似錦纯蛾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捌刮,卻和暖如春碰煌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绅作。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工芦圾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俄认。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓个少,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眯杏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稍算,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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