1. Hello, World

#import <Foundation/Foundation.h>
int main()
{    /* my first program in Objective-C */    NSLog(@"Hello, World! \n");    return ; }

2.  Block(本质是匿名函数,类似C的函数指针, JS closure, C++11的Lambda functions)

(1) example:

__block int sum = ;

        int (^myblocks3) (int a, int b) = ^(int a, int b) {

            sum = a+b;

            return ;

        };

        myblocks3(, ); 
        NSLog(@"sum is %d", sum); 

(2) example:

#import <Foundation/Foundation.h>

// 定义Blocks的typedef

typedef int (^SumBlockT) (int a, int b);

int main (int argc, const char * argv[])

{

    @autoreleasepool {        

        // insert code here...

        NSLog(@"Hello, World!");

        

        void (^myblocks) (void) = NULL;

        myblocks = ^(void) {

            NSLog(@"in blocks");

        }; // 给myblocks 赋值

        NSLog(@"before myblocks");

        myblocks(); // 执行myblocks;

        NSLog(@"after myblocks");

        /*

          before myblocks

          in blocks

          after myblocks

         */

        int (^myblocks2) (int a, int b) = ^(int a, int b) {

            int c = a+b;

            return c;

        };

        NSLog(@"before blocks2");

        int ret = myblocks2(, );

        NSLog(@"after blocks2 ret %d", ret);

        

        __block int sum = ;

        int (^myblocks3) (int a, int b) = ^(int a, int b) {

            sum = a+b;

            return ;

        };

        myblocks3(, );

        NSLog(@"sum is %d", sum);

        

        SumBlockT myblocks4 = ^(int a, int b) {

            NSLog(@"c is %d", a+b);

            return ;

        };

        myblocks4(, );

    }

    return ;

3.语法糖

4. 新关键字

_Packed protocol interface implementation
NSObject NSInteger NSNumber CGFloat
property nonatomic; retain strong
weak unsafe_unretained; readwrite readonly

5. 类和对象

(1)interface内部定义的是instance variables 是私有的,只能在类的implementation中访问。
(2)property定义了属性,编译器会为属性生成getter, setter方法,格式为: @property (参数1,参数2) 类型 名字;
-读写属性:   (readwrite / readonly)

-setter语意:(assign / retain / copy)assign用于简单数据类型。 retain和copy用于对象。

             分别对应弱引用,强引用,拷贝,类似Boost中的weak_ptr, shared_ptr

             可用强引用、弱引用搭配来解除循环引用而导致的内存泄露。 

-原子性:    (atomicity / nonatomic)分别对应有同步锁无同步锁 

(3)-修饰实例方法(非静态方法), + 修饰类方法(静态方法)

#import <Foundation/Foundation.h>
@interface Box:NSObject
{
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
}
@property(nonatomic, readwrite) double height; // Property
-(double) volume;
@end
@implementation Box
@synthesize height;
-(id)init
{
self = [super init];
length = 1.0;
breadth = 1.0;
return self;
}
-(double) volume
{
return length*breadth*height;
}
@end
int main( )
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Box *box1 = [[Box alloc]init]; // Create box1 object of type Box
Box *box2 = [[Box alloc]init]; // Create box2 object of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
box1.height = 5.0;
// box 2 specification
box2.height = 10.0;
// volume of box 1
volume = [box1 volume];
NSLog(@"Volume of Box1 : %f", volume);
// volume of box 2
volume = [box2 volume];
NSLog(@"Volume of Box2 : %f", volume);
[pool drain];
return 0;
}

6.在OC中使用消息发送机制:[receiver message]

如果方法带有参数,那么就写作  [receiver param:value]
方法和名称和参数的名称是一体的,参数决定了方法是什么。

如果有多个参数,那么写作:[receiver param1:value1 param2:value2]

如果类的两个方法参数的类型或个数不同,那它们是两个不同的方法。OC 不支持默认参数的语法。

7. NSAutoreleasePool 与 autoreleasepool,语法:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Code benefitting from a local autorelease pool.

[pool release];

you would write:

@autoreleasepool {

    // Code benefitting from a local autorelease pool.

} 

NSAutoreleasePool被清空或是销毁时向池里所有的autorelease的对象发送一条release消息,从而实现对象的自动释放。

ARC中不能用NSAutoreleasePool,必须用autoreleasepool,目的是兼容MRC。

纯ARC编译的项目,无需要任何pool,编辑器会自动在合适的地方添加release.

pool release 和 pool drain (ios上二者完全相同, ios是reference-counted环境, GC在OS X 10.6后已经废弃)

在一个garbage collected环境里,release不做任何操作。 NSAutoreleasePool因此提供了一个 drain 方法,

它在reference-counted环境中的行为和调用release一样, 但是在一个garbage collected环境中则触发garbage collection动作。

8.(ARC)auto reference count(自动引用计数)

当ARC开启时,开发者不用写retain, release和autorelease,编译器将自动在代码合适的地方插入。

不用手动管理对象的引用计数

(深入)编译的时候插入引用计数的管理代码
(深入)不是GC

考题:Block作为属性在ARC下应该使用的语义设置为?(D)

A. retain

B. weak

C. strong

D. copy

解释:

开发者使用 block 的时候苹果官方文档中说明推荐使用 copy,使用 copy 的原因就在于大家所熟知的把block从栈管理过渡到堆管理

在 ARC 下面苹果果帮助我们完成了 copy 的工作,在 ARC 下面即使使用的修饰符是 Strong,实际上效果和使用 copy 是一样的这一点在苹果的官方文档也有说明

9. Protocol (类似C++中的纯虚类)

定义与实现

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
@interface MyClass : NSObject <MyProtocol>
...
@end 

10. iOS异步操作(多线程)一般都有哪些方式

  • gcd(首选)
  • NSOperation和NSOperation(可以设置并发数和依赖关系)
  • NSThread
  • posix thread(即pthread)

11. GCD(Grand Central Dispatch)

GCD存在于libdispatch.dylib这个库中,有三种,分别为:

串行(SerialDispatchQueue),并行(ConcurrentDispatchQueue)和主调度队列(MainDispatchQueue)。

(0) 定义两个block 
UInt32 loopCount = ; void (^taskFirst)(void) = ^{     NSLog(@"taskFirst 任务开始执行\r\n");     for (UInt32 i = ; i < loopCount; i++) {             }     NSLog(@"taskFirst 任务结束\r\n"); };      void (^taskSecond)(void) = ^{     NSLog(@"taskSecond任务开始执行\r\n");     for (UInt32 i = ; i < loopCount; i ++) {          }     NSLog(@"taskSecond 任务结束\r\n"); };

(1). 串行队列( 同步 和异步)

//同步(一个队列,单线程)

dispatch_queue_t serialQueue;

serialQueue = dispatch_queue_create("serialDemo", NULL);

dispatch_async(serialQueue, taskFirst);

NSLog(@"taskfirst 已经加入队列\r\n");

dispatch_async(serialQueue, taskSecond);

NSLog(@"tasksecond 已经加入队列\r\n");

//异步(多个队例,多线程)

dispatch_queue_t serialQueue;

serialQueue = dispatch_queue_create("serialDemo", NULL);

//创建第二个队列

dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL);

dispatch_async(serialQueue, taskFirst);

NSLog(@"taskfirst 已经加入队列\r\n");

dispatch_async(serialQueueSecond, taskSecond); 
NSLog(@"tasksecond 已经加入队列\r\n");  

(2).并行队列

//效果与串行异步是一样的,不过分配多少个线程是由系统决定的

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

dispatch_async(concurrentQueue, taskFirst);

NSLog(@"taskfirst 已经加入队列\r\n");

dispatch_async(concurrentQueue, taskSecond);
NSLog(@"tasksecond 已经加入队列\r\n"); 

(3).主队列(主调度队列中的任务运行在应用程序主线程上,所以,如果你要修改应用程序的界面,他是唯一的选择。)

dispatch_async(dispatch_get_main_queue(), ^{

    .....//跟新界面的操作

}); 

12. 数据持久化

  • plist文件(属性列表)

  • preference(偏好设置)

  • NSKeyedArchiver(归档)

  • SQLite 3

  • CoreData

详见:http://www.cocoachina.com/ios/20150720/12610.html

Objective-C 学习笔记的更多相关文章

  1. Objective -C学习笔记之字典

    //字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...

  2. Objective -C学习笔记 之copy(复制)

    //自定义类对象实现copy需要遵守copy协议(否则程序崩溃),实现必须实现的协议方法,里面的代码就决定了你的copy是深是浅 #import <Foundation/Foundation.h ...

  3. objc_msgSend消息传递学习笔记 – 消息转发

    该文是 objc_msgSend消息传递学习笔记 – 对象方法消息传递流程 的基础上继续探究源码,请先阅读上文. 消息转发机制(message forwarding) Objective-C 在调用对 ...

  4. ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

    ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...

  5. ESP32学习笔记(一) 环境搭建与下载

    ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...

  6. LDA主题模型学习笔记5:C源代码理解

    1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...

  7. 深度学习笔记(七)SSD 论文阅读笔记简化

    一. 算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法.与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度.针 ...

  8. 深度学习笔记(七)SSD 论文阅读笔记

    一. 算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法.与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度.针 ...

  9. ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

    ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...

  10. ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)

    ufldl学习笔记与编程作业:Logistic Regression(逻辑回归) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听 ...

随机推荐

  1. Codeforces 196C Paint Tree(贪心+极角排序)

    题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...

  2. ubuntu系统克隆

    使用clonezilla,原文地址:http://www.linuxidc.com/Linux/2014-09/107117.htm 类似的一篇:http://storysky.blog.51cto. ...

  3. jenkins发布java项目

    前言:这台jenkins服务器的环境是前几篇博客一步步做实验做过来,如果有想做这篇博客的实验的朋友,可以移驾去看一下前几篇博客,另外有看着博客做完的博友,可以在下方留言,证明我做的这些都是对的,有看着 ...

  4. spring mvc表单的展现、输入处理、校验的实现

    之前已经实现了spring mvc的入门例子及如何处理带参数的请求Controller编写.本文主要记录: 1)重定向请求 2)处理路径中含有变量的请求 3)使用JSR-303进行校验 ① 首先,编写 ...

  5. Nessus虚拟机的几个问题解决办法

    1.使用ppp的校园网或者家庭宽带无法通过桥接上网. 这时要把这俩网卡变成NAT模式就行. 2.国外下载插件包(或者过慢). 我这里贡献个高速链接.base64,懂得自然懂. c3NyOi8vTkRj ...

  6. Java泛型中的类型擦除机制简单理解

    Java的泛型是JDK1.5时引入的.下面只是简单的介绍,不做深入的分析. Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首 ...

  7. 好用的Python IDLE Sublime Text 3推荐

    Sublime Text 3 下载地址为 LINK, Sublime Text 3 is currently in beta. The latest build is 3114. 参考的激活方式为输入 ...

  8. 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】

    http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...

  9. redis主从连接不成功错误

    redis主从连接不成功错误 学习了:https://blog.csdn.net/wzqzhq/article/details/64919133 需要增加 masterauth  password.. ...

  10. 文本聚类——Kmeans

    上两篇文章分别用朴素贝叶斯算法和KNN算法对newgroup文本进行了分类測试.本文使用Kmeans算法对文本进行聚类. 1.文本预处理 文本预处理在前面两本文章中已经介绍,此处(略). 2.文本向量 ...