pod instlall 不会更新已经有的pod,只会更新没有的pod
pod update 会全部更新
Prepo软件自动生成1,2图片
xcode插件目录:~/Library/Application Support/Developer/Shared/Xcode/Plug-ins
xcode插件管理工具:
Alcatraz
2:手动添加依赖
(1)添加依赖库
添加系统依赖库项目名称—>TARGETS—>Build Phases —》
link binary with libraries ; 《这里不能搜索》
(2) 添加依赖库的头文件
添加依赖库发现还是用不了的时候
Target—>Build Settings (All) —>(
Header Search Paths)
("$(SDKROOT)/usr/include/libxml2")
以:"$(SRCROOT)/BlueMobiProject/ThirdParty/BaiduMap_IOSSDK_v2.6.0_Lib/Release$(EFFECTIVE_PLATFORM_NAME)/"
不推荐,麻烦的
$(PROJECT_DIR)/BlueMobiProject/ThirdParty/BaiduMap_IOSSDK_v2.7.0_Lib/Release-iphoneos
eg 添加了libxml2发现还是没有找不到,按照上面的添加
Library Search Paths
GDateXmlNode.m 使用的时候 1:添加依赖库 2:添加search paths 3:添加非Arc
libxml/tree.h no such file or directory
Build Settings-->
Search path-->
Library Search Paths加lib依赖
SRCROOT 和 PROJECT_DIR 都值的是 项目配置目录的上一层
好的:模拟器和手机都可 (
Header Search Paths)
3:Enable Zomble Objects; 检测僵尸对象
4:设置有的老的库不用Arc
只需在
TARGETS里的
Build Phases中,找到
Compile Sources,把涉及到非ARC的类后面加上 -fno-objc-arc 标志
----------------------------------------------------------------------
1:Protocol 类似java的接口
// 继承extends NSObject 实现 Printable和Drawable接口
<>表示实现接口
@interface class MyClass : N
SObject
<Printable, Drawable>
@end
2:
冒号也是方法名的一部分,method和method:是两个不同的方法名
3:
写在.h头文件里的方法都是公开的,Objective-C里没有私有方法的概念
4:
selector就是一个方法指针,类似PHP里的动态方法名:
分类可以给一个已经存在的类增加方法,而不用去改它的源码。Java和PHP中都没有类似的特性。
:继承 <协议> java的接口 ()分类 OC动态语言特性,动态添加方法
6:pch预编译,吧所有include导包放在这里(ios8已经取消)
7:iOS block 匿名函数
blokc和函数很像,有返回值,有形参;block是一个数据类型;可以保存代码,调用方式一样用^
8:ios 引用计数
9:OC是假面向对象,是一门
弱语言【06-弱语法】 java强类型好学
说明1:
// OC是在运行过程中才会检测对象有没有实现相应的方法,即编译,链接都不会奔溃,只有运行时候才会奔溃
may not respose 可能没有xx方法
/*
-[Person test]:
unrecognized selector sent to instance 0x7fd2ea4097c0
给Person对象发送了一个不能识别的消息:test
*/
说明2:// 类可以没有声明,但是运行也不会出错
说明3:父类直接可以调用有子类实例化的方法,OC 弱类型只有警告,可以运行成功;
NSString * str = [Person run]; //动态绑定不报错,只有警告,但是不推荐
说明4:OC不存在空指针错误,空指针对象的方法不会调用(野指针,空指针)
空指针nil = 0
人死不能复生---僵尸对象不能复生
开启僵尸指针检查功能 Enable Zoombie Objecs
10:slef
/*
self的用途:
1> 谁调用了当前方法,self就代表谁
* self出现在对象方法中,self就代表对象
* self出现在类方法中,self就代表类
2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
2> [self 方法名]可以调用其他对象方法\类方法
*/
11:继承
基本上所有类的根类是NSObject (基本数据类型,struct 结构体, enum 枚举)
1> 父类必须声明在子类的前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
List * list = [ArrayList new];
[list.ensureCapacity]; //java直接报错,OC不报错,只会编译给出警告(may not respose),并且OC可以运行成功;
ArrayList * arraylist = (ArrayList * ) list;// 强制转换
[arraylist ensureCapacity 1];
12: OC最重要的内存管理 08内存管理
1:栈内存不在作用域自动回收;堆内存不会自动回收,除非给对象发送销毁消息
2:引用计数器:每个对象内部会分配4个自己存储对象的引用个数
引用计数器操作:retain(引用计数器加1,返回读写本身), release
(引用计数器减1)
, retainCount
(获取引用计数个数);对象死之前调用的方法
dealloc
3:自动引用计数:ARC
- 自动管理引用计数 automatic Reference Counting
注意ARC不是java的垃圾自动回收,他是自动引用计数,是编译器特称;是自动dellac relase; 自动 alloc 对应的relase;
1> 强指针 对象只要没有强指针引用就立刻被释放
2>弱指针 弱指针不能觉得释放释放对象 _ _ weak
__weak
NSData
*data = [[
Person
alloc
]
init
]; // 弱指针,对象以创建就立马释放掉;无用的写法
/*
ARC的判断准则:只要没有强指针指向对象,就会释放对象
1.ARC
特点
1> 不允许调用 release 、 retain 、 retainCount
2> 允许重写 dealloc ,但是不允许调用 [super dealloc]
3> @property 的参数
* strong :成员变量是强指针(适用于 OC 对象类型)
* weak :成员变量是弱指针(适用于 OC 对象类型)
* assign : 适用于非 OC 对象类型
4> 以前的 retain 改为用 strong
指针分 2 种:
1> 强指针:默认情况下,所有的指针都是强指针 __strong
1> 不允许调用 release 、 retain 、 retainCount
2> 允许重写 dealloc ,但是不允许调用 [super dealloc]
3> @property 的参数
* strong :成员变量是强指针(适用于 OC 对象类型)
* weak :成员变量是弱指针(适用于 OC 对象类型)
* assign : 适用于非 OC 对象类型
4> 以前的 retain 改为用 strong
指针分 2 种:
1> 强指针:默认情况下,所有的指针都是强指针 __strong
2> 弱指针:__weak
*/
/*
1.方法的基本使用
1> retain :计数器+1,会返回对象本身
2> release :计数器-1,没有返回值
3> retainCount :获取当前的计数器
4> dealloc
* 当一个对象要被回收的时候,就会调用
* 一定要调用[super dealloc],这句调用要放在最后面
参见内存管理 student.m
2.概念
1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
*/
13:类修改名称如何操作
修改名称,会导致 实现类,引用的地方都会出错
14:NSObject学习
dealloc
15:set get 方法,牵扯内存管理
@property
NSString
* myGirlName; 有property方式声明并且没有手动同时实现get,set方法的会自动生成_myGirlName和get,set方法;
同类型的参数只能写一个i
/*
1.set 方法内存管理相关的参数
* retain : release 旧值, retain 新值(适用于 OC 对象类型)
* assign : 直接赋值(默认,适用于非 OC 对象类型)
* copy : release 旧值, copy 新值
2. 是否要生成 set 方法
1.set 方法内存管理相关的参数
* retain : release 旧值, retain 新值(适用于 OC 对象类型)
* assign : 直接赋值(默认,适用于非 OC 对象类型)
* copy : release 旧值, copy 新值
2. 是否要生成 set 方法
* readwrite : 同时生成setter和getter的声明、实现(默认)
* readonly : 只会生成getter的声明、实现 只读,不允许修改
3.多线程管理 ios屏蔽了直接管理多线程的管理
* nonatomic :
性能高
(
一般就用这个
) 不会自动生成多线程加锁之类的代码
* atomic : 性能低(默认)
4.setter 和 getter 方法的名称 只影响方法名,不影响自动生成成员变量名称,一般用在Bool类型的时候
* setter : 决定了 set 方法的名称,一定要有个冒号 :
* atomic : 性能低(默认)
4.setter 和 getter 方法的名称 只影响方法名,不影响自动生成成员变量名称,一般用在Bool类型的时候
* setter : 决定了 set 方法的名称,一定要有个冒号 :
* getter : 决定了get方法的名称(一般用在BOOL类型)
*
@property
(getter=isRich)
BOOL
rich;
//
常用在
BOOL
的
getter
方法
*/
@interface Person : NSObject
//
返回
BOOL
类型的方法名一般以
is
开头
@property (getter = isRich) BOOL rich;
//
@property (nonatomic, assign, readwrite) int weight;
// setWeight:
@property (nonatomic, assign, readwrite) int weight;
// setWeight:
// weight
//
@property (readwrite, assign)
int height;
@property (nonatomic, assign) int age;
@property (retain) NSString *name;
@end
15:include 循环引用(你引用我,我引用你,死循环 Card Person)?? 内存管理
/*
1.@class 的作用:仅仅告诉编译器,某个名称是一个类
1.@class 的作用:仅仅告诉编译器,某个名称是一个类
@class Person; // 仅仅告诉编译器,Person是一个类
2.
开发中引用一个类的规范
1> 在 .h 文件中用 @class 来声明类
2> 在 .m 文件中用 #import 来包含类的所有东西
1> 在 .h 文件中用 @class 来声明类
2> 在 .m 文件中用 #import 来包含类的所有东西
3.两端循环引用解决方案
p.card = card; c.person = person;
1>
一端用
retain
2> 一端用assign
*/
@autoreleasepool 自动释放池:只有在自动释放迟销毁的时候,放在该池子中的所有对象 release一次;大内存数据不要放在池中
autorelase 返回该对象,吧当前该对象放到自动释放池中,不会影响 引用计数 的个数;
16:协议
protocal 协议 只声明方法,供别的类实现,只有.h文件;
遵守协议,相当java的实现接口
协议只能写方法
<ProtocalName>
遵守协议 代理模式和观察者模式
@optional @require 默认的
最好都遵循基协议 NSObject 协议
/*
1. 协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表 ....
1. 协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表 ....
@end
2.
如何遵守协议
1> 类遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
3. 协议中方法声明的关键字
1> @required ( 默认 )
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
4. 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名 < 协议名称 > * 变量名 ;
id< 协议名称 > 变量名 ;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5.@property 中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名 < 协议名称 > * 属性名 ;
@property (nonatomic, strong) id< 协议名称 > 属性名 ;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
6. 协议可用定义在单独 .h 文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7. 分类可用定义在单独 .h 和 .m 文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
3. 协议中方法声明的关键字
1> @required ( 默认 )
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
4. 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名 < 协议名称 > * 变量名 ;
id< 协议名称 > 变量名 ;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5.@property 中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名 < 协议名称 > * 属性名 ;
@property (nonatomic, strong) id< 协议名称 > 属性名 ;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
6. 协议可用定义在单独 .h 文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7. 分类可用定义在单独 .h 和 .m 文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
*/
17: tableview如何实现不复用
//变成不复用的tableview; 这里图片复用有bug
//StoreEvaluateTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[StoreEvaluateTableViewCell nameForClass]];
NSString *cellId = [NSString stringWithFormat:@"%@-%zd",[StoreEvaluateTableViewCell nameForClass], indexPath.row];
StoreEvaluateTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil) {
cell = [[StoreEvaluateTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[StoreEvaluateTableViewCell nameForClass]];
}