Objective-C 学习笔记
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. 类和对象
-读写属性: (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 param1:value1 param2:value2]
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动作。
当ARC开启时,开发者不用写retain, release和autorelease,编译器将自动在代码合适的地方插入。
不用手动管理对象的引用计数
考题: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 学习笔记的更多相关文章
- Objective -C学习笔记之字典
//字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...
- Objective -C学习笔记 之copy(复制)
//自定义类对象实现copy需要遵守copy协议(否则程序崩溃),实现必须实现的协议方法,里面的代码就决定了你的copy是深是浅 #import <Foundation/Foundation.h ...
- objc_msgSend消息传递学习笔记 – 消息转发
该文是 objc_msgSend消息传递学习笔记 – 对象方法消息传递流程 的基础上继续探究源码,请先阅读上文. 消息转发机制(message forwarding) Objective-C 在调用对 ...
- ufldl学习笔记和编程作业:Softmax Regression(softmax回报)
ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...
- ESP32学习笔记(一) 环境搭建与下载
ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...
- LDA主题模型学习笔记5:C源代码理解
1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...
- 深度学习笔记(七)SSD 论文阅读笔记简化
一. 算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法.与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度.针 ...
- 深度学习笔记(七)SSD 论文阅读笔记
一. 算法概述 本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法.与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度.针 ...
- ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)
ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...
- ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)
ufldl学习笔记与编程作业:Logistic Regression(逻辑回归) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听 ...
随机推荐
- fread函数和fwrite函数
1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 3.说明 ( ...
- 2017 ACM-ICPC 北京区域赛记录
------------------------------------------------------------------------------ 出发日 拖着一个大箱子走是真的累. 下午三 ...
- [翻译] NumSharp的数组切片功能 [:]
原文地址:https://medium.com/scisharp/slicing-in-numsharp-e56c46826630 翻译初稿(英文水平有限,请多包涵): 由于Numsharp新推出了数 ...
- HDU 4349 Xiao Ming's Hope 找规律
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4349 Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/ ...
- The 2016 ACM-ICPC Asia China-Final Contest Promblem D
显然答案具有单调性,可以二分.问题是 我们二分出一个 堆数,该怎么判定能否达到这个堆数呢? 我们可以很简单的用调整法证明,最底下的一层的冰淇淋肯定是最小的那些,往上叠加的话我们再贪心的让较少的放在较小 ...
- ajax跨域-springboot
package com.xxxx.xx.service.configuration; import org.springframework.context.annotation.Bean; impor ...
- Maven自动部署war到Tomcat8
原文:http://www.cnblogs.com/yucongblog/p/5392932.html 我使用的环境是:Eclipse Java EE IDE for Web Developers(V ...
- Android -- 开机启动无界面后台程序
简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 ...
- js逻辑非同时两次使用 !!null
今天遇到了“!!null”的写法,百度没有找到直接的解释,翻书在<javascript高级设计>P44找到了相应的解释: 同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数 ...
- Android 音频的播放之二MediaPlayer
MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...