yaofly2012 / note

Personal blog

Home Page:https://github.com/yaofly2012/note/issues

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Learn Objective-C

yaofly2012 opened this issue · comments

commented

如何学习 Objective-C 语言,这方面最好的书有什么?

  1. 在XCode上使用Objective-C写个Hello World
  2. Cocoa Dev Central: Learn Objective-C
  3. TutorialsPoint: Objective-C Tutorial
  4. Apple Dev: Programming with Objective-C

概念

  1. iOS和OS X操作系统
  2. Preprocessor command 什么是Preprocessor ?
  3. 宏(macro)
  4. Block
  5. 指针
  6. 协议(Protocol)
  7. 代理(Delegate)
  8. ARC, pre-ARC

代码组织:

  1. 工程
  2. 项目
  3. 文件
  4. Group
  5. Targets Xcode -Target , PROJECT 区别 - Xcode

基本语法

关键字
作用域
指令
操作符

类型

类型为啥都是NS开头?

  1. Objective-C解疑:为什么是NS、UI开头?
  2. What does the NS prefix mean?

nil

  1. 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];
}
  1. 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)

函数两种调用方式:

  1. call by value: copy value
  2. call by reference: copy address

有点类似全局函数,用法上又如同JS里的闭包。

  1. 可以在全局,也可以在其他函数、方法和Block内部定义Block(即嵌套Block)。
  2. 可以作为变量的值。

数组

  1. fixed-size
  2. sequential: contiguous memory locations
  3. same type

指针

A pointer is a variable whose value is the address of another variable

是变量,所以它用法通其他变量,也有类型和值,不过值是其他变量的内存地址。

指针变量的内存地址大小是一样的。8btye ?

声明方式:

  1. 一般声明方式 type *var-name
  2. 其他特殊场景方式:
  • 数组变量

没有指定初始值的指针变量的值是个随机的地址?

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

代码规范

大驼峰方式命名文件。

commented

语法

构成

  1. 声明
  2. 实现

封装

  1. 属性都是私有的,只能通过accessor方法访问。

self, super

内置方法:

  1. alloc
  2. init
  3. dealloc

Objective-C属性(property)的特性(attribute)

commented

面向对象

封装原则

commented

预处理器(Objective-C Preprocessor: OCPP)

#import

语法

#import <file.h> // 针对系统文件
#import "file.h" // 自定义文件?

路径搜索

参考

  1. How does #import search for files in Objective-C
  2. Objective-C 中的 import 和 Search Paths
  3. #import vs. #include
  4. #import vs. @class

#pragma mark

Selections

XCode编辑器里文件并不是组织代码的最小单位,还有可选块(Selections)
image

这里会展示当前光标所在的可选块区域。并且XCode默认会把文件里声明的类,类实现,宏等作为可选块。鼠标点击锚点可以看当前文件所有的可选择块:
image
点击可选择块可快速定位到指定代码位置。

自定义Selections

利用#pragma mark可以自定义可选块。有3种方式:

  1. #pragma mark SelectionName
  2. #pragma mark - // 分隔符
  3. #pragma mark - SelectionName // 同时展示分隔符和选择块名称,注意两者中间得有空格隔开

Demo:

#pragma mark declaredPropertiesDemo

// .... 

#pragma mark - arrayOfPointers

则对应展示:
image

commented

Blocks(代码块)TODO

这货不就是JS里的闭包函数么。

  1. Block是个函数,并且可以在任意位置定义,甚至可以在其他函数、方法、Block内部定义。
  2. Block是个对象,可以任意用在变量出现的位置(比如函数形参,函数返回值等)。

闭包

原理

参考

  1. Objective-C Blocks
  2. OC中, block(块)的本质是什么?
  3. Apple-Dev: Blocks Programming Topics
commented

协议(Protocols)

本身只声明类的方法,规定类应该要实现的方法。
有点类似C++里的接口。

实现协议(即遵守协议)

@interface MClass: NSObject<Protocol1, Protocol2> 


@end
  1. 由类实现协议;
  2. 多个协议用逗号隔开

协议继承

一个协议可以继承其他协议

@protocol P2

@end

@protocol P2 <P1>

@end

@protocol P3 <P2, P1>

@end

参考

  1. Objective-C Protocols
  2. oc 中协议 protocol 的使用

委托(Delegation) TODO

什么是委托

  1. Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object.
  2. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

委托是一种设计模式:一个对象代表另外一个对象或者和另外一个对象协同。

概念

  1. The delegate(委托)
  • 委托对象一般要实现具体协议(也叫委托协议 Delegate Protocol),用于跟委托对象进行协同;
  1. The delegating object(委托对象),即委托概念中的Another Object
  • 委托对象一般包含指向其所有委托的引用。

委托和协议

委托是一种设计模式,这种设计模式是通过定义协议来实现的,该协议封装了委托的职责,这样就保证了一个符合标准的类型(称为委托)提供已委托的功能。

参考

  1. Apple Dev: Delegation
  2. Apple Dev: Delegates and Data Sources
  3. Understanding Delegates and Delegation in Swift 4
commented

内存管理

变量如何存储的?

  1. bit pattern
  2. 类型

内存管理

  1. 策略:引用计数(Reference counting)
  2. 还有哪些策略?

Cocoa Dev Central: Learn Objective-C里内存管理章节。

Xcode ARC (automatic reference counting), "release is unavailable"