不用临时变量怎么实现swap(a, b)
1、按位异或^
对应的两个二进制位不相同时就为1,相同就为0
比如9|5,其实就是1001|101=1100,因此9^5=12
规律:
与0^的结果还是本身:5^0=101^000=101=5
相同整数相^的结果是0。比如5^5=0
多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6
因此得出结论:a^b^a= b
在不用第三个变量的情况下,变换两个变量的值。
打印结果如下,在不用第三个变量的情况下,完成了交换:
2、
亲测上边的方法适用于c<d的情况,如果c>d,得出一个很怪的数据:
所以针对上述情况对这种方法进行如下优化:
得出来的结果如下:
3、删除工程中废弃的图片的工具:xcode中查找没有用到的图片的工具。
看使用方法即可。然后下载下来,很方便。
这里在上述第4步以后,command+B编译工程,会报错,说是找不到图片了,,,,结果我们误以为这些图片还有用,结果是因为这个工具删除的只是finder里面的图片,没有删除xcode里面的,所以我们进行了第5步:逐一对xcode中爆红的图片进行删除,command+B编译工程成功。
至此我们就完成了对没有用到的图片的删除工作,完成了工程文件的“瘦身”很重要的一步。
4、今天7.21遇到一个很令人哭笑不得的bug,表现出基础的不足和基础的重要性。
事情的经过是这样的:tableview里面有2个section,因为布局差不多,返回高度也一样,只是section0有一些控件不显示,所以共用一个cell,然后在cell的.h文件里面设置了一个BOOL值,来控制控件的显隐,bug就是出在这个BOOL上边:我们设置布尔值是isHidden,然后就在controller里面的cellforrow里面设置了:如果是section0,那么cell.isHidden=YES,如果是section1,那么cell.isHidden=No,然后在cell的控件布局里面设置if(self.isHidden),隐藏该隐藏的控件,else显示该显示的控件。
一切都很正常,没有什么意外发生。
结果,真机运行,显示无误。但是cell的点击事件didselected发现section0的cell点击不了,但是真机上边还是显示出来cell的UI布局了。看层次发现section0的cell没有!!居然没有!!!!!
因为没有cell,所以点击事件不管用了,这个好理解,可是为啥没有cell,但是UI控件什么的能看到呢?!诡异啊
经过一系列的斗争和排查,我们发现了罪魁祸首是BOOL值,我们知道任何一个控件都有一个属性,就是hidden,控制显隐的嘛。但是需要注意的是:自己设置的布尔值如果名字叫“isHidden”,那么布尔值表示的就是系统的hidden!!!也就是说,controller里面cell.isHidden=cell.hidden!!!!
所以我们将布尔值改成了isMyHidden,然后一切都正常了,没有什么意外发生。哪怕isHidden写错一个字母或者大小写写得不对,都不会出现这样的错误。
5、airdrop不见了
一般我们同事之间传输比较大的文件的时候会选择airdrop,可是有一天我们发现airdrop不见了,怎么把它找出来呢?
第一步:你必须开着WiFi!
第二步:打开finder,菜单栏里面有一个“前往”,在这里面我们可以看到Airdrop,点击,打开airdrop,这时我们的finder页面就是aridrop的在最前面。
然后在菜单栏里面选择“文件”,我们会看到一个选项“添加到边框”,点击。
这样我们的finder左边框就有airdrop了。
6、OOP和OOAD思想
话说看到职位要求上边“掌握OOP的基本思想”或者“掌握OOAD的基本思想”,到底这是什么思想,在这里学习一下,顺便科普一下。
(1)不管是OOP还是OOAD,咱们先来聊聊OO
面向对象(Object-Orientation, 简称OO)是一种系统建模技术。
那么什么是对象呢?
对象是一个客观存在的、唯一的实体。
对象是面向对象编程过程中分析与解决问题的出发点与基础。
对象是拥有自己的标识、数据与行为。
对象是可以简单或复杂。
对象是可以抽象或具体。
对象是在OOP中是一个类的动态实例。
(2)OOP
面向对象编程(Object-Orientation Programming,简称OOP)是按照OO的方法学来开发程序的过程。
OOP的主要特征
1 .抽象(abstract)
2.封装(encapsulation)
3.继承(inheritance)
4.多态(polymorphism)
5.关联(association)
6.聚合(aggregation)
7.组合(composition)
8.内聚与耦合(cohesion & coupling)
(3)OOAD
OOAD(Object Oriented Analysis and Design),面向对象的分析与设计。
OOAD就是面向对象的分析与设计,OOAD是一种方法学。面向对象的方法按照人类的自然思维的方式,面对客观世界建立软件模型。充分体现了对复杂系统进行分解、抽象、模块化等思想。
OOA依照用户所理解的真实世界中的对象和概念,发现和分析对象的内部构成和外部关系,建立准确而简洁的软件系统的对象模型。
OOD是根据已建立的系统对象模型,运用面向对象技术,进行软件设计。
OOAD与传统设计分析(面向过程的)相比优点:
1、在实现的结果和实际问题之间存在一种很接近的匹配关系
2、促进对象的重用
3、由于对象的重用成为可能,从而可以减少错误和维护问题
4、对象的重用还加速了设计和开发的过程
5、符合人类认知的方式,因为这是我们自然的思考方式
6、加强数据封装
7、有助于处理软件开发的复杂性,并帮助生成可修改的、有弹性的软件系统
说到OOAD,不能避免的要说到UML,那么什么是UML呢?
UML是这种OOAD方法学的表现形式,采用OOAD的建模结果就是各种各样UML图。UML和OOAD不可以单独而谈问题,它们密不可分。UML是一种建模语言,是一种标准的表示,而不是一种方法或方法学。方法是一种把人的思考和行动结构化的明确方式。方法需要定义软件开发的步骤,告诉人们做什么,如何做,什么时候做,以及为什么要这么做,而UML只定义了一些图以及它们的意义。它的思想是与方法无关,因此,我们会看到人们将用各种方法来使用UML。而无论方法,如何变化它们的基础是UML的图,这就是UML的最终用途,为不同领域的人们提供统一的交流标准。
软件开发的难点在于一个项目的参与包括领域专家、软件设计开发人员、客户以及用户,他们之间交流的难题成为软件开发的最大难题,UML的重要性在于,表示方法的标准化有效地促进了不同背景人们的交流,有效地促进软件设计开发和测试人员的相互理解,无论分析设计和开发人员采取何种不同的方法或过程,他们提交的设计产品都是用UML来描述的,这有利地促进了相互的理解。
7、关于父类
UIView的父类是UIResponder,说明所有的UIView都具有响应器的特性。
在iphone应用程序中,应用程序的UIWindow也是UIView的子类,也就是说,所有的画面都是在UIView中追加各种UIView而组成的。
UIButton的父类UIControl
8、isKindOfClass和isMemberOfClass的区别
isKindOfClass 确定一个对象是否是一个类的成员,或者是派生自该类的成员
isMemberOfClass 只能确定一个对象是否是当前类的成员
9、drawRect:和layoutSubview的区别
UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。
layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews。addSubview会触发layoutSubviews。
2、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
3、滚动一个UIScrollView会触发layoutSubviews。
4、旋转Screen会触发父UIView上的layoutSubviews事件。
5、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
6、直接调用setLayoutSubviews。直接调用setNeedsLayout。
drawRect在以下情况下会被调用:
1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 调用是在Controller->loadView, Controller->viewDidLoad 两方法之后调用的。
2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
10、关于copy
10、记录今天遇到的bug:真机运行报下图的错:
我们大概读懂是证书不匹配的问题,然后我们就根据证书找各种问题吧,修改,结果最后的原因是xcode8.0的原因。细细道来:
我现在用的xcode7.0.1,有同事换成8.0了,然后他们上传至sourcetree上边的文件会带有一个.entitlements的文件,
然后我checkout下来的工程文件这个aps-environment对应的value不是develpment,是什么忘记了。。。这里需要修改成development。
然后运行的时候报下边的错:
我们把真机上的app删掉,重新跑,还会报time out超时的错。。。然后拔掉真机,重新插上,在运行就没问题了。。。
真是一波三折啊。。。明天就换成xcode8.0。。。
11、其实还是要给出一条建议:在定义变量的同时,给出一个初始值,而不要让编译器默认填充。这样既方便调试,也不会因为Debug或者Release环境的不同而不同。默认填充会有许多的不确定性,不同的编译器也会不同,会引入许多隐含的Bug。
血泪经验 大家写局部变量bool值的时候一定要初始化,因为debug模式默认的是no,release默认的是yes。。。
记得初始化!!!
12、如何给label的文字添加下划线?
添加属性:
NSMutableAttributedString *content = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"博文地址:"]];
NSRange contentRange = {0,[content length]};
[content addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:contentRange];
label.attributedText = content;
也可以通过封装的方法给label里面添加一个imageview,但是上述方法比较简单实用。
13、[[class alloc]init]和[class new]有什么区别?
14、在xcode模拟器上边,我想要删除我的app,结果长按不行,模糊了一会儿,然后就恢复之前的样子了,百度了一下才知道:是因为我的模拟器选择的是苹果7,苹果7上边的app图标具有3D Touch效果,所以,在模拟器上边删除的时候要注意力度!
这里备注一下,最近工程一直没有什么错误,所以没什么事,但是我们要记得:xcode或者工程报稀奇古怪的错误的时候,记得退出xcode重启还有clean xcode!!!
网友评论