必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

要遵循以下结构,您所未注意的一些事

2019-10-05 01:07 来源:未知

pragma mark 概念

/** 默认情况下所有的全局变量都是 外部全局变量只要给全局变量加上 static 关键字 就是内部全局变量 外:多个同名的外部全局变量 指向 同一块存储空间 内:多个同名的全局变量 如果不在同一个文件中,那么指向不同的存储空间 只要用static修改的全局变量就是内部全局变量,只能在当前文件中使用 extern: 用于声明一个外部全局变量 声明只需要在使用变量之前声明就可以了 static: 用于定义一个内部全局变量 声明和定义的区别: 声明不会开辟存储空间 定义会开辟存储空间 */

pragma mark 概念

/** * static 和 extern 局部变量存储在栈中,当作用域结束 系统会自动释放栈中的局部变量 全局变量存储在静态区中,他会随着程序的启动而创建,随着程序的结束而结束 */
查看目录
01 自定义导航栏左上角返回按钮后,返回失效的解决
02 关于tableViewCell上的按钮状态重用问题
03 时间转换上的问题
04 隐藏启动图片的状态栏
05 TableView不显示没内容的Cell
06 判定程序是否是第一次在设备上运行
07 禁止应用横屏
08 本地化按钮状态
09  解决NSTimer在主线程不运行的方法
序言:那个中搜聚了其余iOS开荒者整理的iOS 技艺,知识点小说,方便本身查看(持续更新)

代码组织

pragma mark 代码

#include <stdio.h>#include "lyh.h"/* 全局变量分为两种: 1.外部全局变量,默认情况下所有的全局变量都是外部全局变量 什么是外部全局变量? 可以被其他文件访问的全局变量 我们称之为 外部全局变量 2. 内部全局变量, 只要给全局变量加上 static 关键字 就是内部全局变量 什么是内部全局变量? 只能被当前文件访问的全局变量 我们称之为 内部全局变量 外部全局变量 有一个特点: 可以定义同名的外部全局变量 多个同名的外部全局变量 指向 同一块存储空间 内部全局变量 又一个特点: 也可以定义多个同名的内部全局变量 多个同名的全局变量 如果不在同一个文件中,那么指向不同的存储空间 为了提高数据的安全性, 不让别人在其他文件中修改我们的全局变量,C语言提供了另外一个用于修改全局变量的关键字,static // 只要用static修改的全局变量就是内部全局变量,只能在当前文件中使用 这样就可以提高我们全局变量的安全性 如果多个文件中存在同名的 内部全局变量,相互不影响 如果既有外部全局变量 也有内部全局变量, 那么会优先访问内部全局变量 extern: 用于声明一个外部全局变量 声明只需要在使用变量之前声明就可以了 static: 用于定义一个内部全局变量 声明和定义的区别: 声明不会开辟存储空间 定义会开辟存储空间 */// 编译 出现 main.o// 说我在 mian.c 里面定义了一个num// int num; // 外部全局变量static int num; // 内部全局变量int main(){ /* Undefined symbols for architecture x86_64: "_test", referenced from: _main in main.o ld: symbol not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 找不到text函数 */ num = 998; test(); printf("main.c num = %in",num); return 0;}

#include "lyh.h"// duplicate symbol _num in: 说我重复定义了一个num/*// 编译 出现 lyh.o// 说我在1 mian.c 里面定义了一个num//int num; // 由于Xcode6升级之后导致的,在Xcode6以前是可以的 如果在lyh.c当中 定义外部全局变量 num, 那么我们说过 同名的外部全局变量 指向同一块存储空间,那么如果在多个文件中有同名的外部全局变量,可能导致a文件的数据被B文件不小心修改 降低了数据的封装性,提高了错误的风险*/// extern 关键字 用于修饰全局变量, 代表声明一个全局变量// 注意:声明全局变量 和 声明函数 一样 , 仅仅是告诉系统我们有这个全局变量, 但并不会真正的开辟存储空间//extern int num; // 如果使用命令行输出 不会有问题 cc-c mian.c cc - lyh.c 生成 .o文件 然后 cc mian.o lyh.o 生成a.out/** Undefined symbols for architecture x86_64: "_num", referenced from: _test in lyh.o extern 是声明一个变量, 而不是开辟一块存储空间 *///int num;void test(){extern int num; printf("lyh.c num = %in",num); num = 666;}int num;

pragma mark 代码

#include <stdio.h>//void text;void text();#pragma mark 局部变量/** 局部变量 概念 : 局部变量就是定义在函数,代码块和函数形参列表中的变量,我们就称之为局部变量 作用范围: 从定义的那一行开始 一直知道遇到大括号结束或者遇到return为止 特点: 相同作用域范围内不能出现同名的局部变量 相同作用域范围内 不能出现同名的局部变量 不同作用域欧范围内出 同名的局部变量,内部的局部变量会覆盖外部的局部变量 注意: 局部变量没有固定的初始化值,如果没有对局部变量进行初始化,那么局部变量中是一些随机的值, 所以在开发中 千万不要使用未初始化的局部变量 存储位置: 局部变量存储在栈中,当作用域结束 系统会自动释放栈中的局部变量 */#pragma mark 全局变量/** 全局变量 概念 : 写在函数,代码块,形参列表外 的变量,我们就称之为 全局变量 作用范围 : 从定义的那一行开始 一直 直到文件末尾{暂时这样认为} 特点 : 全局变量 和 局部变量可以同名 如果存在和全局变量同名的局部变量, 那么局部变量会 覆盖 全局变量 注意: 全局变量 如果没有进行初始化, 那么系统默认 会将全局变量初始化为0 存储位置: 全局变量存储在静态区中,他会随着程序的启动而创建,随着程序的结束而结束 */int num; // 全局变量 num = 0;int main(){#warning 局部变量 /* int num = 10; {// int a = 55; int num = 55; printf("num %in",num); }// a = 100;// int num = 20; int b; printf("b = %in",b); */#warning 全局变量 /* int num;// 局部变量 num = 10; // 访问的是局部变量的num printf("num = %in",num); // 10 text(); printf("num = %in",num); */ text; return 0;}//int num; // 全局变量void text(){// printf("num = %in",num);// num = 998; // 访问的是全局变量 num++; // 1, 2 printf("num = %in",num);}//void text//{//// printf("num %n",num);//// int v1 = 22;//}
pragma mark -- 01 自定义导航栏左上角重临按键后,重回失效的缓慢解决
解决方法是在给自定义item初始化时就添加一个监听方法
 //导航左边按钮
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(popTORootController)];
//监听方法
-(void)popTORootController
{
   [self.navigationController popViewControllerAnimated:YES];
}
#pragma mark — NO.1

iOS开采--项目拾疑_下水的知识点(1)

在函数分组和protocol/delegate 完结中利用 #pragma mark -来分类方法,要坚守以下结构

pragma mark -- 02 关于tableViewCell上的按键状态重用难题
最近做的项目中要求有每个cell上有个提醒按钮,以提醒用户在特定的时间做什么事情。这个按钮就存在选中和不选中状态,直接设置的话会导致cell的循环引用,接下来是解决方法有点多
1.给模型写一个BOOL值记录按钮状态 
/**提醒按钮的判断*/
@property (nonatomic , assign) BOOL isMarked;
2.在自定义cell中写一个代理方法(cell.h中)
#pragma mark -- 1.写个协议(解决点击提醒按钮后,循环引用的问题)
@protocol JJChannelDetailsCellDelegate <NSObject>
//实现的方法
-(void)channelCellIsMarked:(BOOL)isMarked Cell:(JJChannelDetailsCell *)cell;
@end
#pragma mark -- 2 定义代理属性
/**代理属性*/
@property (nonatomic , weak) id<JJChannelDetailsCellDelegate> delegate;
3.cell.m中(准备工作是将提醒按钮从xib中拖属性和方法出来)
#pragma mark -- 提醒按钮的点击方法
- (IBAction)clickRemindBtn:(UIButton *)sender {
    [sender setSelected:sender.selected ? false : true]; #pragma mark -- 3.判断代理者是否遵守了代理协议,如果遵守了就做事情
    if ([_delegate respondsToSelector:@selector(channelCellIsMarked:Cell:)]) {
        //如果遵守了代理协议,就把那个按钮的选中状态和当前的cell传过去
        [_delegate channelCellIsMarked:sender.selected Cell:self];
    }
}
4viewController.m中(遵守协议并实现协议方法)
#pragma mark -- 自定义cell的代理方法,用于解决提醒按钮点击后的循环引用
-(void)channelCellIsMarked:(BOOL)isMarked Cell:(JJChannelDetailsCell *)cell
{
    //根据tableView的这个方法拿到
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    if(_channelDetailsArrs && _channelDetailsArrs.count)
    {
        JJChannelDetailsModel *model = [_channelDetailsArrs objectAtIndex:indexPath.row];
        model.isMarked = isMarked;
    }
}
5.最后在cell.m的模型的set方法中给按钮状态赋值
 //重新给提醒按钮的状态赋值
    self.remindBtn.selected = channelDetail.isMarked;
#pragma mark — NO.2

iOS开辟中的一些小才具(不断更新)

#pragma mark - lifeCycle

pragma mark — 03 时日改动上的主题材料
1.在将一个时间字符串转化为NSDate类型时,时区不正确
 NSDateFormatter *fmt = [[NSDateFormatter alloc]init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm";
#    NSTimeZone * timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
 #   [fmt setTimeZone:timeZone];
   //将当前时间转换为那个NSDate格式的
    NSDate *playDate = [fmt dateFromString:self.playTime];

  NSLog(@"%@",playDate);
//如果不加红色的时区设置,直接转换的时间是和实际时间偏差比较大的
#pragma mark — NO.3

iOS优化支出的三种手腕

  • 正是说优化,其实在那之中有个别是一些技巧知识

#pragma mark - custom Accessors

TAG标签:
版权声明:本文由必威发布于必威-编程,转载请注明出处:要遵循以下结构,您所未注意的一些事