`
啸笑天
  • 浏览: 3475268 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

objective-c跬步

 
阅读更多

内存管理规则。


http://www.apple.com.cn/developer/iphone/library/documentation/UserExperience/Conceptual/MemoryMgmt/MemoryMgmt.html

 

让程序在运行过程中不锁屏

[UIApplication sharedApplication].idleTimerDisabled=YES;//not let iphone go to sleep

获取界面语言设置

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

NSString 去掉前后 spaces and tab

NSString *textStr = [_msgTextField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

类变量

与C/C++语言中的静态变量一样,Objective-C 中的类变量就是以 static 声明的变量。(只在当前定义文件中有效)如果子类也想参照父类中的类变量的时候,须定义属性参照方法(类方法)。(这与面向对象中的封装概念有所背驰,降低了凝聚度)

Objective-C中获取类名

NSLog(@"class name>> %@",NSStringFromClass([self class]));

方法二:

Class cls;

cls = [NSString class];

printf("class name %s\n", ((struct objc_class*)cls)->name);

 酷设置应用内的系统控件语言

编辑info.plist,单击右键选择Add Row,名称填入CFBundleLocalizatons,同时向该数组加入一个元素:zh_CN:

<key>CFBundleLocalizations</key>

<array>

<string>zh_CN</string>

<string>en</string>

</array>

 酷

 NSArray *allControllers = self.navigationController.viewControllers;

    UITableViewController *parent = [allControllers lastObject];

    [parent.tableViewreloadData];

 酷

重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object

有时程序崩溃根本不知错误发生在什么地方。比如程序出现EXEC_BAD_ACCESS的时候,虽然大部分情况使用设定 NSZombieEnabled环境变量可以帮助你找到问题的所在,但少数情况下,即使设定了NSZombieEnabled环境变量,还是不知道程序崩 溃在什么地方。那么就需要使用下列代码进行帮助了:

 

 #ifdef _FOR_DEBUG_  

-(BOOL) respondsToSelector:(SEL)aSelector {  

    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  

    return [super respondsToSelector:aSelector];  

}  

#endif  

你需要在每个object的.m或者.mm文件中加入上面代码,并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

Swift项目:

在Swift Complier - Custom Flags下面的Other Swift Flags中加入-D _FOR_DEBUG_

酷__attribute__ ((warn_unused_result))的含义

如果某个函数使用了这个关键字,那么函数在被调用的时候,要检查或者使用返回值,某则编译器会进行警告。

使用场合:在把一些功能封装起来(或者SDK的编写)时候,如果对返回值的使用比较重要,那么使用这个关键字提醒编译器要检查返回值是否被利用。

举例:

-(BOOL)TestFunc:(NSInteger) num __attribute__ ((warn_unused_result))

{

    return num > 0?YES:NO;

}

如果我这么调用

    [self TestFunc:10];

 酷修改UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称

在父级中:

override func viewDidLoad() {
    super.viewDidLoad()
    // 定义所有子页面返回按钮的名称
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
}

 

 酷什么情况下不会autosynthesis(自动合成)?

  1. 同时重写了 setter 和 getter 时
  2. 重写了只读属性的 getter 时
  3. 使用了 @dynamic 时
  4. 在 @protocol 中定义的所有属性
  5. 在 category 中定义的所有属性
  6. 重载的属性

酷 _objc_msgForward消息转发做的几件事:

  1. 调用resolveInstanceMethod:方法 (或 resolveClassMethod:)。允许用户在此时为该 Class 动态添加实现。如果有实现了,则调用并返回YES,那么重新开始objc_msgSend流程。这一次对象会响应这个选择器,一般是因为它已经调用过class_addMethod。如果仍没实现,继续下面的动作。

  2. 调用forwardingTargetForSelector:方法,尝试找到一个能响应该消息的对象。如果获取到,则直接把消息转发给它,返回非 nil 对象。否则返回 nil ,继续下面的动作。注意,这里不要返回 self ,否则会形成死循环。

  3. 调用methodSignatureForSelector:方法,尝试获得一个方法签名。如果获取不到,则直接调用doesNotRecognizeSelector抛出异常。如果能获取,则返回非nil:创建一个 NSlnvocation 并传给forwardInvocation:

  4. 调用forwardInvocation:方法,将第3步获取到的方法签名包装成 Invocation 传入,如何处理就在这里面了,并返回非ni。

  5. 调用doesNotRecognizeSelector: ,默认的实现是抛出异常。如果第3步没能获得一个方法签名,执行该步骤。

上面前4个方法均是模板方法,开发者可以override,由 runtime 来调用。最常见的实现消息转发:就是重写方法3和4,吞掉一个消息或者代理给其他对象都是没问题的

也就是说_objc_msgForward在进行消息转发的过程中会涉及以下这几个方法:

  1. resolveInstanceMethod:方法 (或 resolveClassMethod:)。

  2. forwardingTargetForSelector:方法

  3. methodSignatureForSelector:方法

  4. forwardInvocation:方法

  5. doesNotRecognizeSelector: 方法

酷 自定义的 NSOperation 和 NSThread 需要手动创建自动释放池。比如: 自定义的 NSOperation 类中的 main 方法里就必须添加自动释放池。否则出了作用域后,自动释放对象会因为没有自动释放池去处理它,而造成内存泄露。

但对于 blockOperation 和 invocationOperation 这种默认的Operation ,系统已经帮我们封装好了,不需要手动创建自动释放池。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 145 KB
分享到:
评论

相关推荐

    iOS成长之路

    Objective-C是苹果早期的编程语言,尽管现在Swift已经逐渐成为主流,但理解Objective-C的历史和基础概念仍然是重要的。Swift则以其简洁、安全和高性能的特点,成为了现代iOS开发的首选。在“iOS成长之路”中,你将...

    智能快递柜系统方案全解-共8页.pdf

    移动应用则分别用Java(Android)和Objective-C(iOS)开发,对接Sql Server数据库,确保跨平台的兼容性和用户体验。 在系统开发过程中,不同阶段的任务和目标清晰列出。例如,1.2.3.4.5等里程碑代表了项目推进的...

    Foundation

    这个框架包含了众多用于构建应用程序的基础类和对象,是所有Objective-C和Swift开发者必备的知识。本文将深入探讨Foundation框架的主要组件和关键概念,以便更好地理解和应用在实际项目中。 1. **基本数据类型和...

    AFNetworking.zip

    这个库是用Objective-C编写的,但同样支持Swift项目,因为它提供了Swift友好的API。AFNetworking的设计理念是简单易用,同时保持高度的灵活性和可扩展性。 核心组件: 1. **AFHTTPRequestOperationManager**:这是...

    MyDemos::floppy_disk: Demo 集合 . 黑发不知勤学早,白首方悔读书迟

    MyDemos不积跬步,无以至千里;不积小流,无以成江海学习 Demo 集合:kitchen_knife: 日常练手业精于勤,荒于嬉;行成于思,毁于随目录名称说明时间FanButton轮盘扇形按钮(多用于游戏控制)2019/12/1...

    iOS PNchar图表实用库包,非常好用

    PNChart的API设计得非常友好,使得即使是对Objective-C不太熟悉的开发者也能快速上手。 1. **柱状图(Bar Chart)**:柱状图是数据比较和展示的一种常见方式,特别是在展示不同类别数据的相对大小时。PNChart的柱状...

    100 个Swift必备tips(王崴)

    "100个Swift必备tips(王崴)"是由知名开发者王崴分享的一份宝贵资源,旨在帮助Objective-C开发者顺利过渡到Swift,并为所有Swift学习者提供实用指导。这份资料中的100个Tips涵盖了语法特性、最佳实践、调试技巧等多个...

Global site tag (gtag.js) - Google Analytics