Learn Objective-C
yaofly2012 opened this issue · comments
如何学习 Objective-C 语言,这方面最好的书有什么?
- 在XCode上使用Objective-C写个
Hello World
- Cocoa Dev Central: Learn Objective-C
- TutorialsPoint: Objective-C Tutorial
- Apple Dev: Programming with Objective-C
概念
- iOS和OS X操作系统
- Preprocessor command 什么是Preprocessor ?
- 宏(macro)
- Block
- 指针
- 协议(Protocol)
- 代理(Delegate)
- ARC, pre-ARC
代码组织:
- 工程
- 项目
- 文件
- Group
- Targets Xcode -Target , PROJECT 区别 - Xcode
基本语法
关键字
作用域
指令
操作符
类型
类型为啥都是NS
开头?
nil
-
We can also use this(
nil
) to improve our dealloc method slightly
为什么会提升?
对比两种写法,采用nil
(方式2)少一些代码,可以更快的coding。
// 方式1
- (void) dealloc
{
[caption release];
[photographer release];
[super dealloc];
}
// 方式2
- (void) dealloc
{
self.caption = nil;
self.photographer = nil;
[super dealloc];
}
-
This approach is often better for dealloc because there's no chance of the variable pointing at random data where an object used to be.
随机指向一个对象曾经的数据?
Categaies ?
内存管理
函数
Every Objective-C program has one C function, which is
main()
除了main
函数,不可以定义全局函数,只能作为方法?
多个形参中非首个形参必须添加标签(JoiningArgument)
函数两种调用方式:
- call by value: copy value
- call by reference: copy address
块
有点类似全局函数,用法上又如同JS里的闭包。
- 可以在全局,也可以在其他函数、方法和Block内部定义Block(即嵌套Block)。
- 可以作为变量的值。
数组
- fixed-size
- sequential: contiguous memory locations
- same type
指针
A pointer is a variable whose value is the address of another variable
是变量,所以它用法通其他变量,也有类型和值,不过值是其他变量的内存地址。
指针变量的内存地址大小是一样的。8btye ?
声明方式:
- 一般声明方式
type *var-name
- 其他特殊场景方式:
- 数组变量
没有指定初始值的指针变量的值是个随机的地址?
It is always a good practice to assign a NULL value to a pointer variable in case you do not have exact address to be assigned.
指针算术运算
指针变量的值是内存地址,本质是个64位数字。虽然指针的值是个固定大小(8Byte)的数字,但是这个地址的对应的变量值是有大小的。
结构
预处理器
宏(macro) ?
什么是宏
ANSI standard
代码规范
大驼峰方式命名文件。
类
语法
构成
- 声明
- 实现
封装
- 属性都是私有的,只能通过accessor方法访问。
self
, super
内置方法:
alloc
init
dealloc
面向对象
封装原则
预处理器(Objective-C Preprocessor: OCPP)
#import
语法
#import <file.h> // 针对系统文件
#import "file.h" // 自定义文件?
路径搜索
参考
- How does #import search for files in Objective-C
- Objective-C 中的 import 和 Search Paths
#import
vs.#include
#import
vs.@class
#pragma mark
Selections
XCode编辑器里文件并不是组织代码的最小单位,还有可选块
(Selections)
这里会展示当前光标所在的可选块区域。并且XCode默认会把文件里声明的类,类实现,宏等作为可选块。鼠标点击锚点可以看当前文件所有的可选择块:
点击可选择块可快速定位到指定代码位置。
自定义Selections
利用#pragma mark
可以自定义可选块。有3种方式:
#pragma mark SelectionName
#pragma mark -
// 分隔符#pragma mark - SelectionName
// 同时展示分隔符和选择块名称,注意两者中间得有空格隔开
Demo:
#pragma mark declaredPropertiesDemo
// ....
#pragma mark - arrayOfPointers
Blocks(代码块)TODO
这货不就是JS里的闭包函数么。
- Block是个函数,并且可以在任意位置定义,甚至可以在其他函数、方法、Block内部定义。
- Block是个对象,可以任意用在变量出现的位置(比如函数形参,函数返回值等)。
闭包
原理
参考
协议(Protocols)
本身只声明类的方法,规定类应该要实现的方法。
有点类似C++里的接口。
实现协议(即遵守协议)
@interface MClass: NSObject<Protocol1, Protocol2>
@end
- 由类实现协议;
- 多个协议用逗号隔开
协议继承
一个协议可以继承其他协议
@protocol P2
@end
@protocol P2 <P1>
@end
@protocol P3 <P2, P1>
@end
参考
委托(Delegation) TODO
什么是委托
- Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object.
- The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
委托是一种设计模式:一个对象代表另外一个对象或者和另外一个对象协同。
概念
- The delegate(委托)
- 委托对象一般要实现具体协议(也叫委托协议 Delegate Protocol),用于跟委托对象进行协同;
- The delegating object(委托对象),即委托概念中的
Another Object
- 委托对象一般包含指向其所有委托的引用。
委托和协议
委托是一种设计模式,这种设计模式是通过定义协议来实现的,该协议封装了委托的职责,这样就保证了一个符合标准的类型(称为委托)提供已委托的功能。
参考
内存管理
变量如何存储的?
- bit pattern
- 类型
内存管理
- 策略:引用计数(Reference counting)
- 还有哪些策略?
Cocoa Dev Central: Learn Objective-C里内存管理章节。
Xcode ARC (automatic reference counting), "release is unavailable"