首页 文章 精选 留言 我的

精选列表

搜索[c/c ],共10000篇文章
优秀的个人博客,低调大师

Objective-C 2.0属性(Property)介绍

通常在声明一些成员变量时会看到如下声明方式: @property (参数1,参数2) 类型 名字; 这里我们主要分析在括号中放入的参数,主要有以下三种: setter/getter方法(assign/retain/copy) 读写属性(readwrite/readonly) atomicity(nonatomic) 其中各参数说明如下: assign默认类型,setter方法直接赋值,而不进行retain操作retainsetter方法对参数进行release旧值,再retain新值,如下代码: -(void)setObj:(ClassX*)value { if(obj!=value) { [objrelease]; obj=[valueretain]; } } copysetter方法进行Copy操作,与retain一样nonatomic禁止多线程,变量保护,提高性能readwrite产生setter\getter方法readonly只产生简单的getter,没有setter。 官方参考文档如下: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html 本文转自 yarin 51CTO博客,原文链接:http://blog.51cto.com/yarin/416353,如需转载请自行联系原作者

优秀的个人博客,低调大师

objective-C 数据类型转换

按照数据类型占用存储不同可以自动类型转换或强制类型转换,总的原则是小存储容量数据类型可以自动转换成为大存储容量数据类型。 不同类型数据间按照下面关系的从左到右(从低到高)自动转换, _Bool、char、short int、枚举类型-> int ->long int->long long-> float -> double -> long double。 如果这些数据类型进行混合运算,运算中不同类型的数据先转化为同一类型,然后进行运算,转换从左到右自动转换,如表2-3所示。 表2-3类型转换先后顺序表 操作数1类型 操作数2类型 转换后的类型 _Bool、char、short int、枚举类型 int int _Bool、char、short int、枚举类型、int long int long int _Bool、char、short int、枚举类型、int、long int long long long long _Bool、char、short int、枚举类型、int、long int、long long float float _Bool、char、short int、枚举类型、int、long int、long long、float double double _Bool、char、short int、枚举类型、int、long int、long long、float、double long double long double 如果有下面的表示式,其中,f是float类型,i为int类型,l为long int类型,s为short int类型,结果是什么类型? f * i + l /s 运行结果为float类型,这是因为f是float其它的操作数与float运算其结果就是float类型。 如果遵守类型转换是右到左情况,就需要强制类型转换了,强制类型转换语法形式上很简单,就是在数据前面加上(目标类型),但是这种转换是存在风险的,有可能造成数据的丢失,需要谨慎进行。例如: long int l = 6666666666; NSLog(@"l = %li",l); int i = (int)l; NSLog(@"i = %i",i); 运行的结果是,其中6666666666数值已经超出了int类型的容量,因此出现了数据的丢失。 l = 6666666666 i = -1923267926 强制转换有的时候嵌入在其它的表达式里面,它会与运行的优先级交织在一起,情况就会变的更加复杂,假设有下面的几条语句: int total = 3446; int n = 6; float average = total / n; 运行完成float的变量average结果是574,小数点内容被截取掉了,如果我们采用下面的语句实现: int total = 3446; int n = 6; float average = (float)total / n; 运行完成float的变量average结果是574.333,这个数据要比上面计算的精确,这是因为(float)total先把int类型的total变量转换成为float类型的total变量。 本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1153588,如需转载请自行联系原作者

优秀的个人博客,低调大师

Objective-C的 KVC和KVO

字面意思分别是: KVC是指key value coding,键值编码。 KVO是指key value observing,键值观察。 直白的说法是: KVC就是将一个对象的属性及其值当做一个字典,可以通过属性的名字来访问和修改属性的值。 KVO就是给某个对象的属性添加一个观察者,在这个对象的属性的值发生改变的时候,观察者的回调方法被触发。 本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/p/4396310.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Objective-C:内存管理的小结

内存管理: 1、OC的对象都是分配在堆里的 Perosn *person = [[Person alloc]init]; Person *person //指针类型的变量,放在栈里。 [[Person alloc]init] //在堆里创建的对象,并初始化。 真正的含义: 用指针变量指向了堆中创建出来的对象 Person *person2 = person; //person2和person都指向了同一个对象 2、堆里的对象应该是谁创建,就该是谁释放。系统释放模式分为两种: ARC 自动引用计数 (系统帮助完成内存的释放) MRC 手动引用计数(人为帮助完成内存的释放) MRC: 对于对象类型的实例变量,可以使用@property自动生成相应地存取方法, 但@property中必须要采用retain的内存设置; assign用于基本的数据类型,不需要获取所有权的类型。 ARC: strong 相当于MRC中的retain assign 用于基本的数据类型 weak 不需要获取所有权的对象类型 unsafeunretain 用在不支持weak的旧版本中 3、什么是引用计数? 程序中会出现多个指针指向同一个对象的情况。这种情况下要保证不能提前释放这个对象,必须在所有的指针都不再使用这个对象时候才能释放对象。 计数器:retainCount -(unsigned)retainCount; 对象中存储被引用的次数, 当被引用的时候,计数器加1; -(id)retain; retainCount+1 不在引用的时候,计数器减1; -(void)release; retainCount-1 当计数器为0的时候,真正去销毁对象。-(void)dealloc; //可以重写这个方法,但是切记不要直接显式的调用,因为系统在最后会直接调用它,此时 retainCount=0。 4、对象所有权 指针指向一个对象时,可以获得对象所有权(引用计数器加1); 也可以不获得对象所有权(引用计数器不变化) ARC:strong,weak,assign strong获得对象所有权 MRC:retain ,assign retain获得对象所有权 5、引用计数和字符串 内存中的常量字符串的空间分配与其他对象不同,他们没有引用计数机制 凡是自定义的对象都有引用计数机制; OC内部中对象分为可变对象(NSMutableString等)和不可变对象(NSString、NSArray等), 不可变对象不适用于引用计数的机制,可变的对象适用引用计数机制。 6、对象之间的循环引用 两个对象A、B,有可能会出现一种特殊的情况:A中包含B的实例变量;B中又包含A的实例变量,如果两个实例变量都是强引用(A有B实例变量的所有权,B也有A的实例bl的所有权),然后再两个对象销毁时,会出现A、B都不能正常销毁的情况。 7、对象复制 对象复制中的浅复制和深复制: 浅复制:复制对象时,如果对象中包含对象类型的实例变量,只是复制指针。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是同一个对象。任何一方实例变量对对象做修改,另一方实例变量指向的该对象也就改变了。 深复制:复制对象时,如果对象中包含对象类型的实例变量,要对对象类型的实例变量也要做对象复制。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是不同的对象。不管任何一方实例变量对对象做修改,都互相不影响对方所指向的对象的内容。 用网上一哥们通俗的话将就是: 浅复制好比你和你的影子,你完蛋,你的影子也完蛋 深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。 8、自动释放池(管理需要延迟释放的对象) 由new、copy、alloc创建的对象不会自动入池,需要通过发送autorelease消息,将一个对象添加到其中,以便最后释放:[MyFranction autorelease] 1 #import <Foundation/Foundation.h> 2 #import "Book.h" 3 void ex1(); 4 void ex2(); 5 void ex3(); 6 void ex4(); 7 void ex5(); 8 int main(int argc, const char * argv[]) 9 { 10 //ex1(); 11 //ex2(); 12 //ex3(); 13 //ex4(); 14 ex5(); 15 return 0; 16 } (1)创建自动释放池的两种方法: -NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init] [pool release]《==等价于==》[pool drain]; 1 void ex1() 2 { 3 //创建一个自动释放池对象 4 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 5 //自动释放池的使用 6 Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6]; 7 8 //将book对象加入自动释放池 9 [book autorelease]; 10 [book print]; 11 12 NSLog(@"autorelease last"); 13 //清空自动释放池--会给每个管理的对象发送release消息 14 [pool release];//===[pool drain] 15 } 或者 -@autoreleasePool { } 1 //创建自动释放池的第一种方式 2 void ex2() 3 { 4 @autoreleasepool { 5 6 //自动释放池的使用 7 Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6]; 8 9 //将book对象加入自动释放池 10 [book autorelease]; 11 [book print]; 12 13 NSLog(@"autorelease last"); 14 }//在自动释放池结束时,会给每个管理的对象发送release消息 15 } (2)延迟释放对象 在OC的内置类(NSString、NSArray等)中提供的类方法创建的对象实例都是“延迟释放对象”,也就是在对象创建完成后将对象加入自动释放池。 1 +(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price 2 { 3 return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease]; 4 } 1 void ex3() 2 { 3 @autoreleasepool { 4 //这种对象不需要我们去给它们发release消息。 5 Book *book = [Book bookWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6]; 6 [book print]; 7 //[book release]; 8 } 9 } (3)自动释放池的嵌套 对象在加入自动释放池时,加入的是离它最近的自动释放池,目的是为了让延迟释放的对象尽快得到释放,降低程序运行期间的内存占用; 在管理多个自动释放池时,采用了类似“栈”的结构,可以让对象轻松的找到离它最近的(栈顶的)自动释放池。 1 +(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price 2 { 3 return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease]; 4 } 1 void ex4() 2 { 3 @autoreleasepool { 4 Book *book = [Book bookWithTitle:@"iOS" andAuthor:@"Bill" andPrice:55.6]; 5 [book print]; 6 @autoreleasepool { 7 Book *book2 = [Book bookWithTitle:@"iOS" andAuthor:@"Bill" andPrice:55.6]; 8 [book2 print]; 9 } 10 } 11 } (4)独立的自动释放池 当程序中出现创建大量延迟释放对象的代码时,最好给它一个独立的自动释放池,保证这些对象在不用了后马上释放掉 1 +(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price 2 { 3 return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease]; 4 } 1 void ex5() 2 { 3 @autoreleasepool { 4 for(int i=0; i<10000; i++) 5 { 6 @autoreleasepool {//独立的自动释放池 7 Book *book = [Book bookWithTitle:[NSMutableString stringWithFormat:@"book%d",i+1] andAuthor:[NSMutableString stringWithFormat:@"author%d",i+1 ] andPrice:20+i]; 8 [book print]; 9 } 10 } 11 } 12 } 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4730292.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Objective-C:NSArray的常见操作

NSArray不可变字符串的主要操作有:创建、枚举、排序、与NSString之间的相互转换 注意: NSArray可以存对象,不可以存基本数据类型、结构体、数组、指针、nil、NULL NSArray用nil作为结束标识符。 NSNull可以代表一个空对象。 整个操作还是通过代码来体现吧: .h Person类的声明文件如下: #import <Foundation/Foundation.h> @interface Person : NSObject @property(nonatomic,copy)NSString* name; @property(nonatomic,assign)NSInteger age; +(Person*)personWithName:(NSString*)name andAge:(NSInteger)age; -(id)initWithName:(NSString*)name andAge:(NSInteger)age; -(NSComparisonResult)compareByName:(Person *)aPerson;//声明排序方式为通过姓名比较 -(NSComparisonResult)compareByAge:(Person *)aPerson;//声明排序方式为通过年龄比较 @end .m Person类的实现文件如下: #import "Person.h" @implementation Person +(Person*)personWithName:(NSString*)name andAge:(NSInteger)age { return [[Person alloc]initWithName:name andAge:age]; } -(id)initWithName:(NSString*)name andAge:(NSInteger)age { self = [super init]; if(self) { _name = name; _age = age; } return self; } -(NSString*)description//由于数组存储的是自定义的对象Person对象,所以复写description方法,将NSlog重新格式化输出 { return [NSString stringWithFormat:@"name=%@,age=%ld",_name,_age]; } -(NSComparisonResult)compareByName:(Person *)aPerson//返回一个selector选择器选择的比较方式,字符串比较默认为NSOrderAsecding { return [_name compare:aPerson.name]; } -(NSComparisonResult)compareByAge:(Person *)aPerson//与上同理 { if(_age > aPerson.age) return NSOrderedDescending; else if (_age < aPerson.age) return NSOrderedAscending; else return NSOrderedSame; } @end 主函数测试如下: #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //NSArray测试 /* NSArray可以存对象,不可以存基本数据类型、结构体、数组、指针、nil、NULL NSArray用nil作为结束标识符。 NSNull可以代表一个空对象。 */ //创建一个空对象 NSNull *nul = [NSNull null]; //在一个array中不要求只存相同类型的对象,可以存储任意类型的对象 NSArray *arr = @[@1,@"one",@"2",nul]; NSLog(@"%@",arr); //枚举 NSEnumerator *enumerator = [arr objectEnumerator]; id obj; while(obj = [enumerator nextObject]) { NSLog(@"%@",obj); } //保存到文件中(必须是OC内置的对象,自定义的对象会出错) [arr writeToFile:@"/Users/mac/Desktop/arr.txt" atomically:YES]; //读文件创建NSArray NSArray *arr1 = [NSArray arrayWithContentsOfFile:@"/Users/mac/Desktop/arr.txt"]; NSLog(@"%@",arr1); //排序 NSArray *arr2 = @[@2,@5,@1,@4,@3]; NSArray *sorted = [arr2 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",sorted); NSArray *arr3 = @[@"two",@"three",@"five",@"one",@"four"]; NSArray *sorted2 = [arr3 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",sorted2); //自定义对象的排序 NSArray *arrayperson = @[[Person personWithName:@"Tom" andAge:25], [Person personWithName:@"Jobs" andAge:23], [Person personWithName:@"Bill" andAge:26], [Person personWithName:@"John" andAge:21]]; //按姓名排序 NSArray *sortedByName = [arrayperson sortedArrayUsingSelector:@selector(compareByName:)]; NSLog(@"%@",sortedByName); //按年龄排序 NSArray *sortedByAge = [arrayperson sortedArrayUsingSelector:@selector(compareByAge:)]; NSLog(@"%@",sortedByAge); //NSArray和NSString NSString *str = @"this is a test"; NSArray *words = [str componentsSeparatedByString:@" "];//分隔符 NSLog(@"%@",words); NSString *str2 = [words componentsJoinedByString:@"-"]; //连接符 NSLog(@"%@",str2); } return 0; } 测试结果如下所示: 2015-08-18 17:37:39.772 01-NSArray[1948:112551] ( 1, one, 2, "<null>" ) 2015-08-18 17:37:39.795 01-NSArray[1948:112551] 1 2015-08-18 17:37:39.796 01-NSArray[1948:112551] one 2015-08-18 17:37:39.797 01-NSArray[1948:112551] 2 2015-08-18 17:37:39.797 01-NSArray[1948:112551] <null> 2015-08-18 17:37:39.798 01-NSArray[1948:112551] (null) 2015-08-18 17:37:39.798 01-NSArray[1948:112551] ( 1, 2, 3, 4, 5 ) 2015-08-18 17:37:39.799 01-NSArray[1948:112551] ( five, four, one, three, two ) 2015-08-18 17:37:39.799 01-NSArray[1948:112551] ( "name=Bill,age=26", "name=Jobs,age=23", "name=John,age=21", "name=Tom,age=25" ) 2015-08-18 17:37:39.800 01-NSArray[1948:112551] ( "name=John,age=21", "name=Jobs,age=23", "name=Tom,age=25", "name=Bill,age=26" ) 2015-08-18 17:37:39.800 01-NSArray[1948:112551] ( this, is, a, test ) 2015-08-18 17:37:39.800 01-NSArray[1948:112551] this-is-a-test Program ended with exit code: 0 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4740101.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

小伙子用C语言写出绽放的玫瑰花,成功表白C++代码女神!

今天就给大家带来一个绝佳的礼物,用来跟妹子表白,让大家早点脱离单身汪的生活。 (感谢我吧,这可不容易哦~~~) 那么今天的神秘礼物是什么呢?大家猜猜送妹子什么最好呢? (送什么都不如送玫瑰花呀~~~)没错,今天给大家带来的就是一多缓慢绽放的玫瑰花!话不多说,先看图: 玫瑰花 初具雏形的玫瑰 绽放的玫瑰,送给可爱的XXX 看起来是不是挺不错的呢!大家是不是觉得就结束了呢? “当!然!不!是!”如果只有一朵花怎么能衬托出这中氛围呢?来首音乐才有情调嘛!然后我们再添加一首音乐!一边听着音乐,一边看着一朵玫瑰的绽放,是不是特有情调?(音乐不能截图,有需要的自己来找我吧)也许你就能从此告白成功,脱离单身,走向幸福的两人世界哦!(没成功当我没说(━┳━ _ ━┳━)) 好了下面来看下源码: 这就是程序的全部代码啦!如果想更换音乐只要改下你想要替换的音乐名字改为【音乐】就好了,当然了格式必须是MP3格式的才可以哦

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册