使用 border-image 最大的问题在于,设置的 border-radius 会失效。 我们无法得到一个带圆角的渐变边框。...原因,查看官方规范 W3C 解释如下: A box's backgrounds, but not its border-image, are clipped to the appropriate curve...为此,我们得另辟蹊径或者稍加改进,得到带圆角的渐变边框。...但是在 CSS 中,还有其它方法可以产生带圆角的容器,那就是借助 clip-path。...简而言之,这里,我们只需要在 border-image 的基础上,再利用 clip-path 裁剪出一个带圆角的矩形容器即可: <
Objective-C语言的动态性主要体现在以下3个方面 (1)动态类型:运行时确定对象的类型。 (2)动态绑定:运行时确定对象的方法。 ...一、动态类型 动态类型指对象指针类型的动态性,具体地说就是使用id类型将对象的类型推迟到运行时才确定,由赋给它的对象类型决定该对象类型(说起来怎么这么绕口),也就是说id修饰的对象是动态类型对象,其他在编译期指明类型的为静态类型对象...三、动态加载 动态加载分为两部分:动态资源的加载(如:图片资源),代码模块的加载;这些都是在运行时根据需要有选择性的添加到程序中的,是一种代码和资源的“懒加载”模式,这样降低编译时期对内存的开销,提供程序的性能...在消息传递机制中,当开发者编写[receiver message:xxx]语句进行发送消息后,编译器都会将其转换成objc_msgSend C语言的发送格式。...有了这些参数,objc_msgSend就能根据接收者的isa指针,到其对象的方法列表中以sel 的名称寻找对应的方法。
有一个需求,需要实现一个带圆角的渐变border,大概类似这样:图片上手第一件事当然是康康border支不支持渐变,于是发现:border-image这个属性支持渐变。好!加上,刷新。...欸,我的圆角咋没了!?变成了这样:图片然后才发现border-image这个属性会导致border-radius失效。...然后下面的盒子的位置的top相对于上面的盒子往上移1px,left往左移1px。这样下面的盒子露出来的部分看起来不就像是上面的盒子的边框了吗? 好! 说干就干。...在微信小程序里面1rpx的边框是不生效的,会被计算成2rpx。解决这个问题的办法一般是给想要设置边框的元素加一个大小为它两倍的伪元素。...于是一个完美的1rpx的带圆角的渐变border就出来了:图片全部代码:.border-test{ position: absolute; width: 160rpx; height:
今天,我们来看这么一个非常常见的切图场景,我们需要一个带圆角的虚线边框,像是这样: 这个我们使用 CSS 还是可以轻松解决的,代码也很简单,核心代码: div { border-radius:...那么,在 CSS 中,我们还有其它方式能够实现带圆角,且虚线的单段长度与线段之间间隙可控的方式吗? 本文,我们就一起探讨探讨。...因此,在有圆角的情况下,我们就需要另辟蹊径。 利用渐变实现带圆角的虚线效果 当然,本质上我们还是需要借助渐变效果,只是,我们需要转换一下思路。 譬如,我们可以使用角向渐变。...并且,不管是哪个方法,都存在一定的瑕疵。譬如如果希望边框中间不是背景色,而是镂空的,上述两种 CSS 方式都将不再使用。 因此,对于带圆角的虚线边框场景,最佳方式一定是 SVG。...最后,介绍了借助 SVG 工具 Customize your CSS Border 快速生成带圆角的虚线边框的方式。
内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。...内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。...1 isKindOfClass:Class 检查对象是否是那个类或者其继承类实例化的对象 1 isMemberOfClass:Class 检查对象是否是那个类但不包括继承类而实例化的对象 示例: Objective-c...3 respondToSelector:selector 检查对象是否包含这个方法 Objective-c代码 - (void)doCommandBySelector:(SEL)aSelector {...Objective-c代码 // ... if (!
Objective-C中的hasPrefix hasPrefix:方法的功能是判断创建的字符串内容是否以某个字符开始,其语法形式如下: -(BOOL)hasPrefix:(NSString*)...该方法的返回值为BOOL,当BOOL为YES或者为1时,则字符串是以某个字符开始;当BOOL为NO或者为0时,则字符串不是以某个字符开始。 ...【示例】以下程序通过使用hasPrefix:方法来判断使用stringWithCString:方法创建的字符串是否以字母B开始,如果是以字母B开始,输出开头为字母B;如果不是,输出开头不为字母B。
众说周知,我们平时编写的OC代码,底层都是C/C++实现的 我们可以通过一个终端指令,将我们的OC代码转换成C/C++代码 xcrun -sdk iphoneos clang -arch arm64 -...思考一:OC的对象、类都是基于C/C++什么数据结构实现的??...、类都是基于C/C++当中结构体实现的。...0x102c0a590: 0x000011c9 0x001d8001 0x00000004 0x00000005 还可以通过lldb命令修改对象的值: 类、实例对象、元类(class、instance...在 Objective-C 中,含有一个 isa 指针并且可以正确指向某个类的数据结构,都可以视作为一个对象,其中 isa 指针指向当前对象所属的类,通过苹果开源的官方文档,同样可以发现它的数据结构,如下代码
几何形状”结构 typedef struct{ ShapeType type; ShapeColor fillColor; ShapeRect bounds; }Shape; //返回“枚举颜色”的名称...fillColor = kBlueColor; shapes[2].bounds = rect2; drawShapes(shapes, 3); return (0); } Console窗口的运行结果
OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation...., 但只传递2个参数, 这样方法的第三个参数会自动取我们传的第二个的值 [self performSelector:@selector(printStr1:Str2:Str3:) withObject...方法找不到", NSStringFromSelector(aSelector)]; [NSException raise:@"方法调用出现异常" format:info, nil]; } 2、方法的参数个数与外界传进来的参数数组元素个数不符...//此处不能通过遍历参数数组来设置参数,因为外界传进来的参数个数是不可控的 //因此通过numberOfArguments方法获取的参数个数,是包含self和_cmd的,然后比较方法需要的参数和外界传进来的参数个数...,因此可以推断返回值的具体类型
在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的。...等方法的,需要在XCode中进行设置,设置如下: 把Objective-C Automatic Reference Counting 改为NO,即可。 ...用可变的数组结合着可变的字符串来观察一下retainCount的变化。 ...的变化 用NSString声明的字符串变量的retainCount变化由你初始化字符串时的方式决定 1....FomatRetainCount = 3 2014-08-03 20:18:37.240 Memory[2499:303] 传入的变量RetainCount = 3 Objective-C中得
学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把。在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧。...从小怪兽的角度来讲,怪兽都有那些行为和属性呢?最重要的两点是小怪兽要打英雄对吧,“攻击英雄”的行为是少不了的,另一个是小怪兽打不过怎么办呢?打不过就跑呗,顺理成章,得有“逃跑”行为吧。...小怪兽在攻击英雄的同时生命力是由变化的,会由一个值变到另一个值,所以得有“当前的生命力”和“原来的生命力”,同时“攻击力”和“防御力”对于小怪兽来说也是必不可少的,移动时得有“当前位置”和“原来位置”。...1 // 2 // Location.m 3 // HelloOC 4 // 5 // Created by ludashi on 14-7-27. 6 // Copyright (c)...通过小怪兽的逻辑希望大家会更好的理解面向对象的思想。
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习...在Objective-C中的集合类中主要包括不可变的数组--NSArray, 可变的数组--NSMutableArray, 不可变的字典--NSDictionary, 可变的字典--NSMutableDictionary...一、数组 1.不可变的数组 NSArray 数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型...,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候会自动增加。..., 里面存的是键值对,key的值是不可以重复的。
Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。...@private: 私有的,该实例变量只能在该类的内部访问; 因为要用protected 或者 private来隐藏类的内部细节,用类或者对象是没法直接访问被隐藏的细节的,所以要用getter...和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的getter和setter方法。... 在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。...(保留):这种方式传递的是指针,原有的对象和被赋值的对象的地址是一样的 4.原子操作 atomic: 线程安全的;
刚接触OC不久,今天做深浅拷贝的测试,无意中把获取NSArray的值写成了用下标获取的方式。...到这小菜本人就有柳暗花明又一村的感觉啦~就可以好好的偷一下懒啦~于是系统的总结了一下引入的新的特性,话不多说,Coder说话哪能少的了code呢!...ludashi~走起~(虽然是12年的东西,这不刚学蛮~在OC中用感觉挺新鲜的,简化后对字典的初始化感觉和PHP有点相似~感觉见到亲人啦~) 问题是数组引起的那么就从数组开始吧 1.一般数组的初始化和访问数组元素是这样的...ASCII码的形式,c输出为97 //NSNumber的简化 NSNumber *a = @123; NSNumber *b = @11.2;...NSNumber *c = @('a'); NSLog(@"a = %@, b = %@, c = %@", a, b, c);
Objective-C中runtime机制的应用 一、初识runtime Objective-C是一种动态语言,所谓动态语言,是在程序执行时动态的确定变量类型,执行变量类型对应的方法的...因此,在Object-C中常用字符串映射类的技巧来动态创建类对象。因为OC的动态语言特性,我们可以通过一些手段,在程序运行时动态的更改对象的变量甚至方法,这就是我们所说的runtime机制。...,首先,在头文件中没有提供任何的方法接口,我们没有办法使用点语法做任何操作,privateOne和PrivateTow两个变量虽然声明在了头文件中,却是私有类型的,通过指针的方式我们虽然可以看到他们,却不能做任何读取修改的操作...,你或许会遇到一个问题,ARC下,编译器不允许你将int类型的值赋值给id,在buildset中将Objective-C Automatic Reference Counting修改为No即可。...六、动态的为类添加方法 这个runtime机制最强大的部分要到了,试想,如果我们可以动态的向类中添加方法,那将是一件多么令人激动的事情,注意,这里是动态的添加,和类别的最大不同在于这种方式是运行时才决定是否添加方法的
用Objective-C做过开发的朋友都知道,类里面的属性(可以近似地理解为类的变量)是用@property关键字定义的,然后@property后面的括号,会写上若干「特性(attribute)」,后面跟数据类型...用的时候就照葫芦画瓢。 现在大伙儿慢慢转向苹果的新开发语言Swift,似乎亦不必花太多时间在Objective-C上。...在2006年的WWDC大会上,苹果发布了Objective-C 2.0,其中就包括Properties这个新的语法,把原来的实例变量定义成Properties(属性)。...因此,写getter和setter,可算是Objective-C中「约定俗成」的做法了。...Objective-C2.0之后: 庆幸的是,程序员都喜欢「偷懒」,所以就有了2006年Objective-C2.0中的新语法:Properties。
上一篇中,所有代码都是放在同一个文件main.h中的,这显然不是一个好的方式,代码多了以后,看着就头大。...可以将其进行拆分: 1、将所有枚举、结构的定义单独放在一个文件ShapeDef.h中 //定义“几何形状类型”枚举 typedef enum { kCircle, kRectangle, kOblatesShperoid
,是个对象方法,-开头 重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值 重写构造方法的注意点: 1.先调用父类的构造方法([super init]) 2.再进行子类内部成员变量的初始化...3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用 4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类 6.Category...2.当第一次使用某个类时,就会调用当前类的+initialize方法 3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法) 先初始化父类,再初始化子类(先调用父类的+...-description方法默认返回的是“类名+内存地址” 8.SEL SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。...在类A中把一个成员变量_age声明为protected,则: 在A的方法中: 当然可以直接访问_age 在B中的方法: 可以访问A的实例对象a中的_age,也可以访问B的_age 14.缩进 在XCODE
在学习iOS App开发中遇到需要计算时间差并格式化输出的需求,没有现成的方法,需要结合NSCalendar和NSDateComponents来实现。...所以干脆把代码封装成一个熟悉的dateDiff方法。...不过这个方法跟VB和sql里的dateDiff还是有点不一样,虽然可以封装成完全一样,不过我觉得直接返回NSDateComponents会更方便,因为所需要的各种单位上的值都包含在其中了。...我是把代码封装到自己的一个工具类KRUtils里作为类方法,使用起来也很方便。
领取专属 10元无门槛券
手把手带您无忧上云