Math.pow(1.1, Day)

iOS some notes and TJ App

阶段性小结

###OC的动态特性

编译和链接要做的事情推迟到runtime(c和汇编实现)来做

动态类型:运行时决定对象类型 动态绑定:运行时决定调用的方法 动态加载:在运行时根据需求加载资源

###tableview

tableview<uitableviewDataSource, uitableviewDelegate>,为了展示table,我们必须遵循两个协议并实现对应的方法。dataSource连接着数据和view,它对应的必须实现的方法是:cellForRowAtIndex,numberOfRowInSection。uitableViewDelegate处理ui的展示,比如每行的高度。

值得注意的是:除了在代码层遵守协议和实现方法,我们还需要将view中的元素和vc用协议关联起来,操作方法就是右键drag UI元素到VC上,然后选中要关联的协议。

###收起键盘

首先在头文件中加入UITextFiledDelegate协议,然后在sb中将ui元素和VC的协议关联,最后在源文件中实现下面的方法

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == self.txt) {
        [textField resignFirstResponder];
    }
    return YES;
}

###cell的使用

自定义cell和默认cell的使用区别

//赋值的时候不加类型申明会有警告,但是元素的tableCell的就可以不用加
//UITableViewCell* orgCell = [tableView dequeueReusableCellWithIdentifier:cellId ] ;
if (orgCell == nil ){
    orgCell = [[uitableviewCell alloc] initWithStyle: uiTableViewCellStyleDefaultDefaultReserIdentifier: cellId];
}


MyCell* cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier: id]
if (cell == nil){
    NSArray* nib = [[NSBundle mainBundle] loadNibNamed: id owner:self options:nil];
    cell = nib[0] ;
}

###拼接字符串

[nsstring stringWithFormat: @"%@, %@", str1, str2] ;
[[nsstring alloc] initWithFormat: ...]

init.. 是实例方法,string…是类方法,

###weak, strong ,copy 等等

在没有property的世界里,要设置/访问一个对象的属性,我们需要手动实现setter和getter

{
    NSString *_recievedContent;
}

//setter
-(void)setRecievedContent:(NSString *)recievedContent
  {
     _recievedContent = recievedContent;
  }
//getter
  -(NSString *)recievedContent
  {
     return recievedContent;
  }

有了property,就一句话搞定

@property (nonatomic, copy) NSString *str; 

那么nonatomic等属性是什么意思呢?这类属性分为三类:

原子性

  • atomic(默认):atomic 意为操作是原子的,意味着只有一个线程访问实例变量。atomic 是线程安全的至少在当前的访器上我是安全的。但是很少使用。比较慢,这跟 ARM 平台和内部锁机制有关。
  • nonatomic:跟 atomic 刚好相反。表示非原子的,可以被多个线程访问。它的速度比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

访问器控制

  • readwrite(默认):readwrite 是默认的,表示同时拥有 setter 和 getter。
  • readonly:readonly 表示只有 getter 没有 setter。

内存管理

  • retain:使用了 retain 意味着实例变量要获取传入参数的所有权。具体表现在 setter 中对实例变量先 release 然后将参数 retain 之后传给它。
  • strong:是在ARC伴随IOS引入的时候引入的关键字是 retain 的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong 跟 retain 的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

  • assign(默认):用于值类型,如 int、float、double 和 NSInteger,CGFloat 等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的 delegate。
  • weak: weak 跟 assign 的效果相似,不同的是 weak 在对象被回收之后自动设置为 nil。而且weak 只能用在 iOS5 或以后的版本,对于之前的版本,使用 unsafe_unretained。
  • copy:copy 是为是实例变量保留一个自己的副本。

###synthesize

在xcode4.4之前,要使用这个属性手动生成getter和setter

@synthesize recievedContent = _recievedContent;

xcode5之后,就不需要synthesize了,但是如果你用了synthesize,那么你可以直接使用变量(不需要self.前缀)

// 没有synthesize时,这么用
self.recievedContent = @"xxxxxxxxx";

@synthesize recievedContent;
// 加上这么一句,就可以这么写
recievedContent = @"xxxxxxxxx";  

self.var 调用的是 getter 方法,而var是对这个指针的操作。

ps:但,这的区别是什么呢?getter的本质也是从内存去数据,指针也是从内存地址去拿数据把。

###定义变量的几种方法

私有实例变量:在源文件中的interface中用大括号定义。这种变量只能在内部访问。(据测试,下载interface和implemention关键词后面效果一样)

@interface SelfInfoTableViewController ()
{
    NSArray *var;
}
@end
@implemention
{
    nsstring * var;
}
@end
//在源文件中可以直接使用(不需要self.var)

在头文件中申明property (方便外部访问),内部通过self.var来访问

@property  (nonatomic,strong) NSArray *basicInfo;

在头文件中的interface关键字后面申明。(经过简单的测试貌似方案1没什么区别,有个特点是,写在头文件中,一目了然,看接口就知道这个方法用到了哪些内部变量;但写在m文件中也省去了切换文件的麻烦)

@interface loadingView: UIView
{
    NSString* str;
}

###方法

//类方法
+ (void) method;
//实例方法
- (id) method;

方法调用,时要向对象发个消息。方括号里面就是消息表达式 (不就是调用方法吗?为什么叫发消息)

// x = [[NSString alloc] init ] 
//alloc 类方法,分配内存,init实例方法

###UI设置

// 定义所有子页面返回按钮的名称
navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

ps: about队列 http://www.cnblogs.com/dsxniubility/p/4296937.html

##TJApp

done

  • tabbar icon
  • use navigation manage detail
  • 解析不规则的json
  • 在app中去掉detail页面中的nav
  • 禁止webview下拉效果
  • 使用navigation管理webview
  • 自定义navigation样式
  • tab 切换
  • 显示加载状体
  • 下拉刷新
  • segue modal 展示detail
  • 无网络的提示(点击刷新)
  • OC和JS通信(webview引入的页面同时要兼容移动浏览器和原生App)
  • 手势左滑动来后退
  • loadingView的居中问题

###todo

  • collection view 展示壁纸
  • 缓存数据(增加失效日期)