tips-0

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff; min-height: 21.0px}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #ffffff}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4cbf57}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #4cbf57}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #e44448}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #d28f5a}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c2349b}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #e44448}p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #8b84cf}p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #d28f5a}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s3 {font: 18.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures}span.s4 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s5 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s6 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s7 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s8 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s9 {font-variant-ligatures: no-common-ligatures; color: #e44448}span.s10 {font-variant-ligatures: no-common-ligatures; color: #4cbf57}span.s11 {font-variant-ligatures: no-common-ligatures; color: #d28f5a}span.s12 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s13 {font: 18.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #4cbf57}span.s14 {font: 18.0px 'Apple Color Emoji'; font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s15 {font: 18.0px 'Apple Color Emoji'; font-variant-ligatures: no-common-ligatures}span.Apple-tab-span {white-space:pre}

1.添加全局断点,让程序停在错的地方 Add Exception Breakpoint

  1. 延迟多少秒调用谁的什么方法
    //afterDelay 秒
    //self 这个方法属于谁
    //performSelector : 方法å
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    2.1 // 延迟0.25秒就会调用里面代码块的东西
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    //code...
    });

  2. NSBundle
    //获取到我们的APP的路径
    NSBundle *myMainBundle = [NSBundle mainBundle];
    // 返回的就是一个图片的全路径
    NSString *filePath = [myMainBundle pathForResource:iconName ofType:@"png"];

  3. 使用OC数组的迭代器来遍历
    // 每取出一个元素就会调用一次block
    // 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
    // obj就是当前取出的元素, idx就是当前元素对应的索引
    // stop用于控制什么时候停止遍历
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx == 1) {
    *stop = YES;
    }
    NSLog(@"obj = %@, idx = %lu", obj, idx);
    }];

  4. 如果使用OC数组存储对象, 可以调用OC数组的方法让数组中所有的元素都执行指定的方法
    // 注意点: 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错
    // [arr makeObjectsPerformSelector:@selector(say)];

// withObject: 需要传递给调用方法的参数
[arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"lnj"];

  1. 该方法默认会按照升序排序
    NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person obj2) {
    // 每次调用该block都会取出数组中的两个元素给我们
    // 二分
    // NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2);
    return obj1.age > obj2.age;
    // return obj1.age < obj2.age;
    /

    if (obj1.age > obj2.age) {
    // 5 4
    return NSOrderedDescending;
    }else if(obj1.age < obj2.age)
    {
    // 4 5
    return NSOrderedAscending;
    }else
    {
    return NSOrderedSame;
    }
    */
    }];

  2. // 如何判断当前是ARC还是MRC?
    // 可以在编译的时候判断当前是否是ARC

if __has_feature(objc_arc)

NSLog(@"ARC");

else

NSLog(@"MRC");

endif

8.#if LP64 || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;

else

typedef int NSInteger;
typedef unsigned int NSUInteger;

endif

  1. 获取屏幕的尺寸
    // CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;

10.#if defined(LP64) && LP64

define CGFLOAT_TYPE double

define CGFLOAT_IS_DOUBLE 1

define CGFLOAT_MIN DBL_MIN

define CGFLOAT_MAX DBL_MAX

else

define CGFLOAT_TYPE float

define CGFLOAT_IS_DOUBLE 0

define CGFLOAT_MIN FLT_MIN

define CGFLOAT_MAX FLT_MAX

endif

/* Definition of the CGFloat' type andCGFLOAT_DEFINED'. */

typedef CGFLOAT_TYPE CGFloat;

11-1. initWithFrame 使用代码初始化的时候会调用,在这里一般做一些,不会调用任何方法
"用途:初始化操作(子控件)"

init 在调用init方法的时候 系统默认会调用一次initWithFrame

----------------------------使用代码来创建会调用的的方法-----------------------

initWithCoder 当从stroyboard/xib加载就会调用这个方法,而这个方法一般是正在初始化子控件
也就是这个方法内部自控件可能是没有值
"用途:当你需要在初始化子控件之前做一些操作的时候,可以在这个方法内部写"

awakFromNib 只要调用完了initWithCoder之后,就直接调用awakeFromNib
当调用的时候,这个里面的子控件都是有值
"用途:在这里可以给自控件赋值(属性)"
----------------------------通过xib/storyboard加载会调用的方法-----------------------

11-2.
+(instancetype)shopView
{

//  LYSShopsView *view=[[NSBundle mainBundle] loadNibNamed:@"LYSShopsView" owner:nil options:nil].firstObject;

//    NSArray *arr=[[NSBundle mainBundle] loadNibNamed:@"LYSShopsView" owner:nil options:nil];
//    LYSShopsView *view=(LYSShopsView *)arr[0];

/**传入NSBundle对象时,nil代表mainBundle
 *Returns an UINib object initialized to the nib file in the specified bundle.
 *拿到xib-->nib文件对象
 */
UINib *nib=[UINib nibWithNibName:@"LYSShopsView" bundle:nil];
//获取nib文件对象内的控件数组
NSArray *arr=[nib instantiateWithOwner:nil options:nil];
LYSShopsView *view=(LYSShopsView *)arr.lastObject;
return view;

}

12.产生随机数
u_int32_t arc4random(void);
void arc4random_addrandom(unsigned char * /dat/, int /datlen/);
void arc4random_buf(void * /buf/, size_t /nbytes/) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
void arc4random_stir(void);
u_int32_t
arc4random_uniform(u_int32_t /upper_bound/) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);

ifdef BLOCKS

int atexit_b(void (^)(void)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
void *bsearch_b(const void *, const void *, size_t,
size_t, int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);

endif /* BLOCKS */

13.//创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义
NSDictionaryOfVariableBindings(...);

14.//创建类名字符串
NSStringFromClass(id);

15.复习简单plist文件解析
// 1.拿到plist的文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cars.plist" ofType:nil];
// 2.创建对应的JSON数据
NSArray *dicts = [NSArray arrayWithContentsOfFile:filePath];
// 3.JSON->Model
NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:dicts.count];
for (NSDictionary *dict in dicts) {
// 3.1 Dict->Model
XMGCar *obj = [XMGCar carWithDict:dict];
[arrayM addObject:obj];
}

15-1. Dict->Model

+ (instancetype)carWithDict:(NSDictionary *)dict
{
    XMGCar *car = [[self alloc] init];
    //    car.name = dict[@"name"];
    //    car.icon = dict[@"icon"];
    //    car.money = dict[@"money"];
    
    // kvc 相当于上面3行
    [car setValuesForKeysWithDictionary:dict];
    
    return car;
}

16.KVC 可以修改ReadOnly 的key 但是按照编码规范不可以改(可以改但不能)

17.被static修饰过的局部变量仅仅是延长生命周期,,对外还是不可见,就是说还是局部变量

18.//创建一个容纳上限为18的可变数字
   NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:18];

19.typedef NSUInteger NSStringEncoding;(NSString.h)

20.//输出结果: "sss\nsss"
NSString *str1=@"sss.txt";
NSString *str= [str1 stringByDeletingPathExtension];//这个方法在NSPathUtilities.h中
NSLog(@"%@",str);//自动换行
const char *s=str.UTF8String;//返回的是静态char*字符指针,存在静态/常量区
printf("%s",s);

21.UITableViewController用法

设置ViewController继承自UITableViewController
删除storyboard中原有的控制器
拖进新控制器
设置新控制器class:ViewController
设置新控制器is initial
实现2个数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

22.// 懒加载
- (NSArray *)tgs
{
    if (!_tgs) {
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];
        NSArray *dicts = [NSArray arrayWithContentsOfFile:filePath];
        
        NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:dicts.count];
        for (NSDictionary *dict in dicts) {
            XMGTg *obj = [XMGTg tgWithDict:dict];
            [arrayM addObject:obj];
        }
        
        _tgs = [arrayM copy];
    }
    return _tgs;
}

23.有关@property(readonly)....A....在.h中写着对外公开但只读,而且在.m中不能用_A赋值,只生成get方法
    所以在.m中的类扩展中可以再声明一次A @property() ...A...就可以对外只有get,对内都有

24.引入Mansonry
//define this constant if you want to use Masonry without the 'mas_' prefix
#define MAS_SHORTHAND

//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS

#import "Masonry.h"

25.NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);

26.求NSString*对象的size(需要传入UIFont字典)
#1单行
// 先计算label内文字的范围size//
// sizeWithAttributes:内部一般传入字体大小即可(如果label内的文字间距属性修改过的话,还需要传入文字间距)
CGSize nameSize = [self.status.name sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0]}];
#2多行
// 多行文字高度的计算,需要用到
//[self.status.text sizeWithFont:<#(UIFont *)#> constrainedToSize:<#(CGSize)#>];
#warning 求出text的bounds
 [self.text boundingRectWithSize:<#(CGSize)#> options:<#(NSStringDrawingOptions)#> attributes:<#(NSDictionary *)#> context:<#(NSStringDrawingContext *)#>]
// boundingRectWithSize:CGSize文字限制范围(一般限制宽度)
// options:枚举NSStringDrawingUsesLineFragmentOrigin
// attributes 传入文字属性@{}
CGSize textMaxSize = CGSizeMake(textW, CGFLOAT_MAX);
#define TextFont [UIFont systemFontOfSize:15.0]//自己写的宏
#CGFLOAT_MAX//系统的,前面有
CGSize temp = [self.status.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: TextFont} context:nil].size;

27.MJExtention用法
#一般

1.//        // 字典数组 -> 模型数组
  //        _tgs = [XMGTg objectArrayWithKeyValuesArray:dictArray];

2.//        _tgs = [XMGTg objectArrayWithFile:[[NSBundle mainBundle] pathForResource:@"tgs" ofType:@"plist"]];
3.//_tgs = [XMGTg objectArrayWithFilename:@"tgs.plist"];
#复杂,模型内有模型
if (!_carGroups) {
    // 说明MJCarGroup类中的cars数组,里面要存放MJCar模型
    [MJCarGroup setupObjectClassInArray:^NSDictionary *{
        return @{@"cars" : [MJCar class]};//return @{@"cars" : @"MJCar"};好像也可以
    }];
    _carGroups = [MJCarGroup objectArrayWithFilename:@"cars.plist"];
}
return _carGroups;

28.UITableView.h内部的私有NSIndexPath分类
@interface NSIndexPath (UITableView)

+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;

@property(nonatomic,readonly) NSInteger section;
@property(nonatomic,readonly) NSInteger row;
@end
29.#warning WeiBaoM 是一个模型数组1⃣️,内的对象都是id的,没有点语法2⃣️
// return self.WeiBaoM[indexPath.row].cellH;
return [self.WeiBaoM[indexPath.row] cellH];

30. // 5.配图:宽高100,左边与正文对齐,顶部距离正文距离为10
#warning 注意分情况
CGRect picture_Ima_frame = CGRectZero;
if (self.picture) {
    CGFloat pictureW = 100;
    CGFloat pictureH = 100;
    CGFloat pictureX = textX;
    CGFloat pictureY = margin + CGRectGetMaxY(text_Lab_frame);
    picture_Ima_frame = CGRectMake(pictureX, pictureY, pictureW, pictureH);
}
self.picture_Ima_frame = picture_Ima_frame;

31.自定义控件在storyboard中的使用:(和系统控件是一样的)
自定义的控件也能在storyboard中拖出使用,先拖出父控件(系统定义的),然后改名字为自定义类名即可.
自定义控件在storyboard中的使用,相当在storyboard中创建控件,调用.m.h/(或xib)方式(2中)的初始化方法(不调用整体布局方法,storyboard来布局)alloc,init/(initWithCoder,awakFromNib),只有.h.m文件但是又没有初始化方法,也可以在storyboard中使用,(有父控件的初始化)/实现一个awakFromNib(在内修改控件内部属性),则默认掉用了父控件的initWithCoder/nib
//在storyboard中的在dequeue..中用的,不用注册,dequeue的第二层封装会直接穿件storyboard中的
//(只有.h.m文件但是又没有初始化方法,也可以在storyboard中使用,注册无布局frame)

32.#pragma mark - 状态栏显示与否
//- (BOOL)prefersStatusBarHidden
//{
//    return YES;
//}

33.botton有四种属性
disable highlight normol selected

34./**当一个控件被添加到父控件中就会调用*/可用于自定义子控件等(UIView.h中的方法)&//旋转图片

-(void)didMoveToSuperview
{
    NSLog(@"%s",__func__);
    if (self.group.opened) {
        self.nameView.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);//旋转图片
#旋转图片  另外M_PI_2是系统宏定义在math.h中 M_PI_2 可记为 m(math).Pi.2
    }else{
        self.nameView.imageView.transform = CGAffineTransformMakeRotation(0);
    }
}
- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

- (void)didAddSubview:(UIView *)subview;
- (void)willRemoveSubview:(UIView *)subview;

- (void)willMoveToSuperview:(UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(UIWindow *)newWindow;
- (void)didMoveToWindow;

35.感觉各种出现的按钮都被叫做action :
比如,向左滑动,实现commitedit..后,通过editActions ...编辑加入多少个按钮,类环境.在editActions ...内UITableViewRowAction 设置按钮样式
比如;UIAlertController *提示框中的UIAlertAction *也是设置按钮样式

36.JSON数据就是一堆的键值对.一般写在xxoo.json上
{
    "size" : "98x98",//逗号间隔
    "idiom" : [//value为数组
               {"watch":"98x98"},
               {"size": "98x98"}
               ],
    "info" : {//value为字典
         "version" : 1,
         "author" : "xcode"
         }
}

37.设置程序的图标和,启动图片.只需要,按照一定的规矩命名图片,并把它们放入images.x..文件夹就可以了
file:///Users/Ruojue/Movies/IOS2期/资料/day10/代码/09-图标和启动图片

38.pt(点) >= ps(像素)//不同屏幕一个点有不同的像素//点和英寸相关
 imageView.frame = CGRectMake(0, 0, 100, 100);//pt(点)100x100个
像素图片要有三张,用在不同的屏幕上
// home.png -> 100x100像素//这个现在已经不做这个图片了,太old了
// home@2x.png -> 200x200像素
// home@3x.png -> 300x300像素

// 非retina: 100x100像素//非视网膜
// retina: 200x200像素//视网膜
// plus: 300x300像素

39.alpha// alpha<=0.01,完全透明,可以穿透,可以穿透的意思是就像不存在一样,可以点击里面那层的按钮等
     而且>=1,时XCode会调成半透明,用判段改成0.99就行

  设置父控件的hidden=yes,其子控件也会被隐藏
  设置父控件的ilpha==0.01,其子控件也会被影响 ,变得看不见
40.// 尺寸自适应:会自动计算文字大小
[label sizeToFit];

41.三.函数介绍:

NSStringFromClass:根据一个类名生成一个类名字符串

NSClassFromString: 根据一个类名字符串生成一个类名

四.思想,为什么使用NSStringFromClass NSStringFromClass:输入类名有提示,避免输入错误

42.// 1.确定重用标示:
static NSString *ID = nil;
if (ID == nil) {
    ID = [NSString stringWithFormat:@"%@ID", NSStringFromClass(self)];
}
 1.static NSString *str=[NSStringFromClass(self.class) stringByAppendingString:@"ID"];//会报错,要先定义一个static,然后拿引用去赋值
 2.static NSString *ID;
  ID=[NSStringFromClass(self.class) stringByAppendingString:@"ID"];//不报错

43. //设置滚动区内编剧
//这里设置完了,tableView会滚到相应偏移位置,相当于自己操作滚动,调用了那些滚动代理方法
self.tableView.contentInset=UIEdgeInsetsMake(HeadViewH+TabBarH, 0, 0, 0);

44.
#warning  lable sizeToFit lable自适应字体大小
[self.lable sizeToFit];
#warning 烦了一个错,navigationBar,应该由栈顶控制器的navigationItem属性设置,而不是navigationController.navigationItem
//self.navigationController.navigationItem.titleView=self.lable;
self.navigationItem.titleView=self.lable;

45.
NSString *filePath =[tempPath stringByAppendingPathComponent:@"apl.plist"];
#warning  这两句等价
NSString *filePath =[tempPath stringByAppendingString:@"/apl.plist"];
46.
#define FOUNDATION_EXPORT  FOUNDATION_EXTERN

#define FOUNDATION_EXTERN extern

//系统的NSObjCRuntime.h

47.当自己的类,需要别的类的数据,或者要改别的类属性时,在自己的类,设一个容器,存放别的类,就可以拿到别的类,实现目的,这时为了降低耦合,用代理容器,存别的类,用协议方法,实现数据交互.(非MVC中的相关类)

48.M_PI 180度 // pi
M_PI_2 90// pi/2

这是弧度2PI r(周长)
弧度 2PI 360

placeholder 占位符

49.contantoffsize内容偏移量以内容原点为原点,计算,可视范围于内容的原点相比差值

推荐阅读更多精彩内容