oc

Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

柔情痞子 提交于 2019-11-28 16:57:22
Objective—C语言的新魅力 一、引言 在Xcode7中,iOS9的SDK已经全面兼容了Objective-C的一些新特性和新功能。这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的iOS系统,那么这些特性有什么样的用处呢,作为开发者,我保证你一定会爱上他们,如果你可以将这些新特性都应用于你的开发,你的开发效率和代码质量,相比之前,会有一个很大的提升。 二、Nullability检测的支持 在swift语言中,通过!和?可以将对象声明成Optional,用于在开发中标记这个对象是否可以为空。在OC中,以前是没有这样的功能的,因此我们在开发中会经常遇到因为某个函数应该返回实例而返回了空导致的崩溃。Nullability的主要用武之地,就是在这里,它可以起到提示开发者做是否为空得判断的提示。 打开Xcode7,系统的框架中已经支持了Nullability,如下: @property (nullable, nonatomic, readonly) ObjectType firstObject; @property (nullable, nonatomic, readonly) ObjectType lastObject; 这是NSArray中的两个属性,其中nullable关键字说明了这里可能返回空的值。

61 (OC)* 代理 block 通知 代理 kvo

别说谁变了你拦得住时间么 提交于 2019-11-28 15:05:55
1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高。 block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。 2.从使用场景区别block和delegate 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。当1,2个回调时,则使用block。 delegate更安全些,比如: 避免循环引用。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。 delegate回调返回的参数被限制在了 NS 类的范围内,数量也很有限(当然可以用直接调用方法的形式在绕过,并不推荐;也可以用 Array 套着传, 不过这样需要有文档支持,不然不够清晰,回调方法也需要独立的验证,故也不推荐)。 效率 肯定是delegate比NSNotification高。 KVO提供一种机制,当指定的被观察的对像的属性被修改后

Object-C基础-01-概述

纵饮孤独 提交于 2019-11-28 14:00:26
回到顶部 前言 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会配合着使用C语言、C++,OC主要负责UI界面,C语言、C++可用于图形处理。近来,流传Ruby、C#也可以开发iOS应用程序了,甚至还说Ruby比OC更适合写iOS程序。这让不少学习iOS开发的朋友感到很困扰,究竟学哪门语言好呢?OC会不会被Ruby、C#取代呢?如果被取代了,那我的OC不是白学了?下面我发表一下个人观点: 1> Ruby、C#也能做iOS开发,我觉得这也不算什么坏事,能让更多领域的人投入iOS开发,汇集更多程序猿的智慧,多创造一些让人眼前一亮、有划时代意义的app,进而丰富AppStore、促进iOS的发展、造福消费者。 2> OC这门语言一直由苹果公司在维护,苹果当初选择OC作为iOS的开发语言,肯定是有理由的,这也说明了苹果对OC的肯定。从iPhone的成功也可以看出,苹果选择OC是对的。因此,我觉得OC被其他语言取代是不太可能的。 3> 退一万步讲,假如OC真的被Ruby它们取代了,我觉得这对经验丰富的OC开发者来说,并不是什么致命的打击。不可能因为OC被淘汰了,广大OC开发者就没办法在软件行业混下去了。OC作为一门面向对象的语言,它的编程思想跟其他面向对象的语言都是差不多的,只不过语法特性不同。因此,你学了OC之后绝对不会吃亏

OC学习第一天

て烟熏妆下的殇ゞ 提交于 2019-11-27 09:18:26
还记得敲C代码那是几年前的事情,最近突发奇想想学习一下IOS,于是找了一些网上资料来学习(主要参考该文 http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html ),看了看,对OC的第一感觉是太奇葩了,不想平时的那些语法一样。还好网上资料比较细致、齐全,说说今天学习走过的弯路(就是中括号的使用范围,在变量声明、方法声明、方法定义中有无中括号): #import <Foundation/Foundation.h> #import "Student2.h" (头文件,声明变量以及方法) @interface Student : NSObject {//变量的声明一定要在这个中括号内部 @public; int age; int no; int score; NSString *name; int Chinese; int Englist; } //方法的声明则在中括号外侧 -(int)sum; -(int)sum:(int) Chinese andEnglish:(int)English; @end (实体文件,包含方法的实体) @implementation Student //此处无需中括号包含 -(int)sum{ return Chinese+Englist; } -(int)sum:(int) Chinese

oc-内存管理 - 探路篇

瘦欲@ 提交于 2019-11-27 03:44:17
一、过程: 生成对象 -> alloc 持有对象 -> retain 释放对象 -> release 废弃对象:所有引用都释放 -> dealloc 二、MRC:需要手动释放自己持有的对象 [参考资料]: http://www.open-open.com/lib/view/open1460693431491.html NSObject负责内存管理 非自己生成的对象通过retain方法实现持有对象。 id obj = [NSArray array]; // 取得非自己生成并持有的对象 [obj retain]; 调用autorelease后,对象不会被立即释放,而是注册到autoreleasepool中,知道pool结束,对象才被释放。 ⚠️无法释放非自己持有的对象,但可持有非自己生成的对象。 三、ARC:自动释放自己持有的对象 释放方式: 1、赋其他值 2、超出作用域 所有权修饰符 _ _strong id类型和对象类型默认 在超出变量作用域后被释放 _ _weak 解决循环引用问题(易发生互相强引用) 当引用计数为0时,自动赋值nil 必须是oc对象(assign可以非oc对象) weak被赋以一个非自己生成的对象,weak并不会立即释放,而是注册到AutoreleasePool中,延长生命周期。 不持有对象 ⚠️与assign的区别 assign是指针赋值,不对引用计数操作

OC语言自学《十一》---- OC(内存管理知识总结)

跟風遠走 提交于 2019-11-27 00:09:31
一、 retain、release retain方法给对象的引用计数器+1 release方法给对象的引用计数器-1 retain方法会返回对象本身,release方法没有返回值 dealloc方法 当一个对象要被回收的时候会被调用 重写的时候,一定要调用[super dealloc]方法,这句调用一定要放到最后面 空指针 OC中没有空指针异常 没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错 野指针 指向僵尸对象(不可用的内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS) 僵尸对象 所占用内存已经被回收的对象,僵尸对象不能再使用 二、retain、release使用注意 谁retain,谁release 只要你调用了retain,无论这个对象是如何生成的,你都要调用release 有始有终,有加就有减 曾经让对象的计数器+1,就必须在最后让对象计数器-1 如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease 你想使用某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 当你不想在使用某个对象时,我们就该让对象的计数器-1(让对象做一次release操作) 谁retain,谁就release 谁alloc,谁就release 三

OC调用c++函数

烂漫一生 提交于 2019-11-26 17:42:20
#include <openssl/evp.h> #include <openssl/md5.h> #include <string> #include <stdio.h> static std::string encode_pass(std::string pass) { std::string tmpStream; //TODO: return tmpStream; } 如何调用这个cpp的函数得到结果呢? 我是这么做的。 新建一个oc的类,h文件: #import <Foundation/Foundation.h> @interface OCEncode : NSObject +(NSString *)encodeString:(NSString *)str; @end 然后m文件: #import ... static std::string encode_pass(std::string pass) { std::string tmpStream; //TODO: return tmpStream; } @implementation OCEncode /** 调用cpp函数,获得 */ +(NSString *)encodeString:(NSString *)s{ const char* destDir = [s UTF8String]; std::string