- 浏览: 700639 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
shappy1978:
自己踩死自己了,我还是有远见的嘛
该死的微软,该死的IE -
calosteward:
I know Zxing and shopsavvy, bot ...
[trans]COMPARISON OF MOBILE BARCODE SCANNERS -
qq690388648:
唉……四年前的Bug,现在还没改,Apache也有不足的地方啊 ...
POI解析Word表格备忘 -
shappy1978:
Now I get to say that every met ...
Jailbreak Detection on iOS -
hebeixiaolei:
你好,我想问一下,用poi如何往word文档里插入超链接呀!
POI读取Word文档总结
在学习苹果公司的iPhone SDK过程中碰过太多的问题了,由于缺乏名师指导,很多磕磕碰碰,也难免有不少牢骚,开一个帖子记录吧.对SDK的总结:
1 开发工具和技术的封闭性给很多初学者造成太多障碍,特别是集成了IB,用户对IB的工作机制不甚了解,造成很多问题.
2 关于什么地方retain,什么地方release,我现在还不是掌握的很好.
//***************************************************
自动创建按钮,一开始我是这样的
UIButton *btnNormal = [[UIButton buttonWithType:UIButtonTypeRoundedRect] initWithFrame:CGRectMake(0, 0, 40, 20)]; [btnNormal addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside]; [btnNormal setTitle:@"Normal" forState:UIControlStateNormal]; [btnNormal setFont:[UIFont systemFontOfSize:8]]; [titleView addSubview:btnNormal];
可是发现里面的文字(Title)死活出不来,一开始以为是字体大小/颜色/对齐有问题,试了很久,最终发现是该死的initWithFrame,非圆角按钮都可以按上述用法,圆角按钮则必须这样用:
UIButton *btnNormal = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btnNormal setFrame:CGRectMake(0, 0, 40, 20)];
你会知道苹果公司的代码是多么无厘头了吧.
//***************************************************
关于release的问题,这个问题远没有教科书上写的那么简单,一搬我们认为,如果一个对象被其他对象引用(赋值)了一次,就会retain一次,比如
UILable *lbl=[[UILable alloc] initWithFrame:...]]; ... [contentView addSubview:lbl]; [lbl release];
上面的方法是对的,lbl被引用到view中,可以release了,可是你把UILable换成UIButton试一试,release就会出错.我才或者跟组件继承的父类或者轻量级别有关,不过苹果公司显然是在扇自己一个巴掌.
还有在使用NSURLConnection时,NSURL和NSURLConnection不能release,否则会导致访问错误或者无限等待.
实际上,困难在于不是我不想或者忘记release,而是不知道是否应该release,或者这需要较长时间的经验
上面的几个代码都有点类似,实际上是OC几个不太规范的类,类似与button和image,都是不需要alloc和release的。 --shappy
//***************************************************
关于上面的release,总结出几个情况(这几个代码都是错误的)
NSString *userID=app.userID .... [userID release];
这种情况下release是会报错的,这种指针的赋值不需要release
NSArray *json = [jsonString JSONValue]; .... [json release];
jsonFramework中的json对象同样不能release,似乎是个autorelease?
Font *font=[UIFont systemFnotOfSize:18]; xxx [font release];
又一次我用了上面的代码,结果被反复调用几次后就会报错,估计也是autorelease的对象,对于非显示alloc的对象,一搬是不需要释放的。类似 UIImage *img = [UIImage imageNamed:@"xxx"],这个据说是autorelease的,而且iPhone只支持这种读取图片文件的方式,这意味着只能由AutoreleasePool自己释放,在频繁读取大图片的时候,很容易造成崩溃。
没有alloc就不需要release,按照这个原则就ok了
//***************************************************
关于NSMutableArray的release问题,测试结果如下:
- (void)viewDidLoad { NSLog(@"view2 load"); NSLog(@"retaincount:%d",[myData retainCount]); myData = [[NSMutableArray alloc] init]; NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"Name1",@"title",@"New Name",@"subtitle",nil]; [myData addObject:dict]; [dict release]; dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"Name2",@"title",@"New Name",@"subtitle",nil]; [myData addObject:dict]; [dict release]; NSLog(@"retaincount:%d",[myData retainCount]); [super viewDidLoad]; }
即使我在头文件中写了@property (nonatomic, retain) NSMutableData *myData;,第一次retiancount还是0,alloc后才设置为1,而注意到dict,是必须release的。看看delloca
- (void)dealloc { NSLog(@"view2 dealloc"); NSLog([[myData objectAtIndex:0] valueForKey:@"title"]); NSLog([[myData objectAtIndex:1] valueForKey:@"title"]); [myData release]; NSLog(@"retaincount:%d",[myData retainCount]); [super dealloc]; }
结果如下:
2010-05-28 15:01:44.209 HelloWorld[1770:207] view2 dealloc
2010-05-28 15:01:44.210 HelloWorld[1770:207] Name1
2010-05-28 15:01:44.211 HelloWorld[1770:207] Name2
2010-05-28 15:01:44.211 HelloWorld[1770:207] retaincount:1
1 dealloc中可以 removeAllObjects,但是retainCount还是不会减少
2 如果把数组中的object在release,会报告“double free”的错误,估计删除时候会自动卸载。
评论
如果是alloc方式创建的button可以释放,如果是通过类方法获取的不需要,cocoa内存管理原则认为其计数器为1且设置为自动释放了。如果是类方法获取的对象区分强弱引用,如果是全局的弱引用则需要手动的retain一下 保证不会被AutoreleasePool回收。
类似 UIImage *img = [UIImage imageNamed:@"xxx"],这个据说是autorelease的,而且iPhone只支持这种读取图片文件的方式,这意味着只能由AutoreleasePool自己释放,在频繁读取大图片的时候,很容易造成崩溃.
这个你可以通过 [UIImage imageWithContentsOfFile:path];用NSBundle绑定路径加载图片,不用使用imageNamed:的application bundle获取图片内存里缓存。
其实内存只要注意 retain和release对应就好了
发表评论
-
Xib Enhanced by XCode8
2016-12-05 17:02 718I have a solution: Open stor ... -
Script to Build Universal Lib
2016-11-30 11:06 713https://www.raywenderlich.com/ ... -
Fortify Scan
2016-11-21 18:53 1293sourceanalyzer -b buidl_id -Xm ... -
Inside Code Signing
2016-11-17 14:44 600Mac OS Version 10.0 Cheeta 1 ... -
Cross Compile Script of Tesseract
2016-11-14 18:51 900The script on internet is both ... -
Homebrew saying Xcode is outdated
2016-10-28 18:44 556http://stackoverflow.com/ques ... -
iOS开发--适配iOS 10以及Xcode 8
2016-10-17 15:35 591http://www.cocoachina.com/ios/ ... -
install app to simulator
2016-09-26 16:44 1010前言 刚刚接触iOS的时候,我就一直很好奇,模拟器上面能不 ... -
issues in XCode 8
2016-09-26 16:37 642http://www.cocoachina.com/bbs/ ... -
XCode Plugin
2016-07-15 18:43 704* cmd+shift+9 //manage plugi ... -
Speedup Coding in XCode
2016-07-15 17:52 518www.cocoachina.com/ios/201607 ... -
Wifi API in iOS
2016-07-15 10:31 455查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或者 ... -
About Hockey App
2016-07-04 11:38 495* free acc can only has 2 app, ... -
Appium Device Test
2016-06-29 17:18 385* set udid, device name won't ... -
[Trans] Integration between OC and JS
2016-06-28 18:47 493iOS 开发中,我们时不时的需要加载一些 Web ... -
Jenkins iOS Automation Comment
2016-06-24 16:47 575* SDK null will by default bui ... -
Salabash Test Comment
2016-06-08 19:29 410* Device test need to enable U ... -
Calabash
2016-06-02 18:24 704//calabash-cucumber for ios ... -
BDD Setup
2016-05-20 15:04 533—brew /usr/bin/ruby -e " ... -
Setup Git
2016-04-01 19:23 563http://www.tomdalling.com/blo ...
相关推荐
- **创新隐喻**:虽然iPhone操作系统中有许多现成的隐喻可以借鉴,但在适当的情况下,开发人员也可以尝试创新的隐喻,只要这些新的隐喻能够更好地适应应用场景并且易于用户理解。 #### 四、一目了然,即看即点 ...
通过分析“iPhone游戏编程实例—俄罗斯方块”这个基于Cocos2d的实战案例,我们不仅了解了iOS游戏开发的基本流程和技术要点,还深入探讨了在游戏开发过程中可能会遇到的关键技术选择。对于想要进入iOS游戏开发领域的...
【描述】提到用户对此工具有困惑,不清楚如何操作。这表明iASign可能提供了一种非标准的安装途径,可能涉及到Cydia Impactor、Xcode的Ad-Hoc签名或者企业级证书签名等方法。这些方法允许开发者在没有通过App Store的...
因此,软件开发过程中必须对用户需求进行深入的调查,并通过用户体验测试来不断优化设计。 未来的UI设计师将需要具备综合能力,包括美术设计、程序编码、市场调查、心理学分析等。设计师在了解产品功能的同时,还...
4. 保持定义语句的指导作用:定义语句不仅是设计开始时的指导,也应在开发过程中持续作为衡量新功能和设计决策的标准。任何偏离定义语句的新想法都应谨慎考虑,确保它们符合最初的设计理念。 5. 设计适配iOS设备:...
【APP界面设计的简明化】是当前移动应用开发领域中的一个重要趋势。简明化设计旨在减少用户在使用APP时的认知负担,通过简洁的视觉语言和直观的操作方式,提升用户体验。这种设计理念源于对用户需求的深入理解,尤其...
Bullet物理引擎被广泛认为是游戏开发领域中占有重要地位的一款工具,特别是在支持移动设备(如iPhone)方面具有独特的优势。它是一款开源、免费的物理引擎,遵循Zlib许可协议,这意味着开发者可以在商业项目中自由...
在iOS应用开发中,TabBarController是用户界面设计中常见的组件,用于展示多个主要功能区域,每个区域通常对应一个底部的标签。然而,苹果的原生TabBar可能无法满足所有设计需求,尤其是当需要实现中间按钮突出或者...
这部分讨论了如何利用标准手势、提供及时反馈和简化输入流程来增强交互性。 #### Inputting Information Should Be Simple and Easy(输入信息应简单易行) 输入信息的过程应该尽可能简化,避免给用户带来不必要的...
自苹果推出iPhone以来,iOS便成为了智能手机操作系统中的佼佼者。它不仅凭借其独特的设计理念和出色的用户体验获得了广泛认可,更是重新定义了智能手机的概念。 **初识iOS:惊艳与便捷** 初次接触iOS系统时,用户...
程序设计策略部分讨论了如何明确程序定义,即开发团队需要列出用户可能喜欢的功能点,并确定目标用户群体,然后通过用户定义筛选功能点。文中还强调,设计应为设备量身定制,拥抱iOS界面规范,并确保在不同设备(如...
响应式设计的核心目标之一是提升用户体验,然而在实际应用过程中,并非总能达到这一目标。传统的博客设计往往遵循固定的模式:从上至下的布局、左右两侧分别放置内容和图片、侧边栏提供额外信息(如最近发布的文章)...