把字典转成实体类的方法 当然你可以使用KVC的setValuesForKeysWithDictionary:方法,下面的方法也是一种解决方案。如果使用setValuesForKeysWithDictionary:方法,则Model基类中必须得重写下面的方法,不然如果遇到字典的Key和modle的属性不对应的情况则会出现程序崩溃的情况。
在公司做项目一直使用Storyboard,虽然有时会遇到团队合作的Storyboard冲突问题,但是对于Storyboard开发效率之高还是比较划算的。在之前的博客中也提到过,团队合作使用Storyboard时,避免冲突有效的解决方法是负责UI开发的同事最好每人维护一个Storyboard, 公用的组件使用轻量级的xib或者纯代码来实现。这样不但提高了开发效率,而且可以有效的避免Storyboard的冲突。如果每个人维护一个Storyboard, 遇到冲突了就以你自己的为准就OK了。
轮播图循环滚动原理:往ScrollView上贴4张图顺序是3-1-2-3。首次显示1的位置,然后滑动,等滑动到最后一个3时,无动画切换到第一个3的位置,然后在滚动。 ScrollView上的第一张图片和最后一张图片一样,你想显示的第一张图片放到ScrollView上的第二张,并改变Scollview的Contentoffset显示ScrollView上的第二张图片,当时间到时,自动改变ScrollView的ContentOffset.x的值,有动画的切换到下一张图片。如果目前是最后一张图片则无动画的切换到ScrollView的第一张图片,因为第一张图片和最后一张图片是一样的,所以用户看不到这个无动画的切换,切换后,图片有开始从第一个开始滚动,所以就可以无限循环的滚动了,
动画:
[self transitionWithType:kCATransitionPush WithSubtype:indexPath.row ForView:cell];
- (void) transitionWithType:(NSString *) type WithSubtype:(NSInteger) row ForView : (UIView *) view
{
NSString *subtype = nil;
if (row%2 == 0) {
subtype = kCATransitionFromLeft;
} else {
subtype = kCATransitionFromRight;
}
//创建CATransition对象
CATransition *animation = [CATransition animation];
//设置运动时间
animation.duration = 0.5f;
//设置运动type
animation.type = type;
if (subtype != nil) {
//设置子类
animation.subtype = subtype;
}
//设置运动速度
animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;
[view.layer addAnimation:animation forKey:@"animation"];
}
UICollectionViewController的父亲(父类)是UIViewController, 而UIViewController的父亲是UIResponder,UIResponder继承自NSObject。
把一个整体(完成人类生存的所有工作)切分成不同的部分(分工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一个整体,并完成这个整体所需要的所有活动,这就是架构。
所以当我们说软件架构的时候,我们一定要讲清楚,究竟说的是部署的架构,还是代码的架构
如果项目开始,没有考虑架构的问题,以后随着业务功能的增多,流量的增加,可能会重写代码,推翻原有架构,重新设计等等说法,来说明架构的进化。这实际上就是当初为了完成任务,没有充分思考所带来的后果。
尽量不要让代码成为系统长大的瓶颈,降低架构分拆的成本。
UICollectionViewController的父亲(父类)是UIViewController, 而UIViewController的父亲是UIResponder,UIResponder继承自NSObject。
.用#import指令来导入相应的文件,#import的作用相当于PHP中的require_once,如果文件之前导入过了,则不导入,而#include会重复导入文件的
//创建对象,完成对象的声明,内存分配,初始化
Student *student = [[Student alloc] init];
//重写init方法,为本类添加构造方法
-(id) init
{
if (self =[super init])
{
studentName = @"dashi";
age = 18;
hobby = @"hehe";
}
return self;
}
//实现便利构造器,进行类的实例化并调用initWithName
+ (id) studentWithName:(NSString *)name age:(int)sAge
{
Student *student = [[Student alloc] initWithName:name iAge:sAge];
return student;
}
Student *s2 = [Student studentWithName:@"dashi2" age:20];
strong : 表示强引用关系,即拥有对象的所有权。
weak : 表示弱引用,不拥有对象的所有权,当目标对象被销毁之后,属性值会被自动设为nil;
assign(赋值): 直接赋值,计数器不会加一,简单的赋值方法,默认赋值方式,适合基本数据类型
copy(拷贝):把原来的对象拷贝过来,计数器会加一,比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02;
retain(保留):这种方式传递的是指针,原有的对象和被赋值的对象的地址是一样的
+(void) initialize; 在类第一次使用该类时调用该方法,第二次就不调用了
测试:重写initalize方法
//重写initialize方法,会在类第一次使用时调用
+(void) initialize
{
NSLog(@"initialize方法被调用了(类第一次被实例化)!");
}
//返回当前对象所对应的类
NSString *className =(NSString *) [self class];
NSLog(@"%@类的display方法", className);
//返回当前对象所对应的父类
NSString *superClassName = (NSString *) [self superclass];
NSLog(@"%@类的父类是%@", className, superClassName);
-(BOOL)isKindOfClass : (Class)aClass 判断某个实例是否属于某个类或者子类的对象
BOOL b = [o2 isKindOfClass:[ObjectTest class]];
多态简单的说就是对于不同对象响应同一个方法时做出的不同反应。
NSArray *array = @[@"lu", @"da", @"shi", @YES, @123];
NSDictionary *dictionary = @{
@"key0" : @"value0",
@"key1" : @"value1",
@"key2" : @"value2"
};
NSLog(@"key2 => %@", dictionary[@"key2"]);