当前位置:  编程技术>移动开发
本页文章导读:
    ▪object-c 内存储器管理(2) 内存管理策略        object-c 内存管理(2) 内存管理策略 现在搞iphone开发,一直不是很懂object-c的内存管理机制,看到apple的官方文档写的不错而又没有找到翻译的文章。于是自己在学习它的过程中就顺便把它.........
    ▪ 见习第五天——老大不在,自学成才。今日的十八个收获        实习第五天——老大不在,自学成才。今日的十八个收获 为了详细地记录一天中的各种小收获,我开始实时记笔记了。不过由于是在Ubuntu下的外文系统,所以不得不用英文了。 The communicati.........
    ▪ DCT原形 ——傅里叶级数       DCT原型 ——傅里叶级数傅里叶级数 法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示(选择正弦函数与余弦函数作为基函数是因为它们是正交的).........

[1]object-c 内存储器管理(2) 内存管理策略
    来源: 互联网  发布时间: 2014-02-18
object-c 内存管理(2) 内存管理策略

现在搞iphone开发,一直不是很懂object-c的内存管理机制,看到apple的官方文档写的不错而又没有找到翻译的文章。于是自己在学习它的过程中就顺便把它翻译了,自己的英语不是太好,文字组织能力那就更菜了,读的蹩脚之处还望大家指出,我好在以后的翻译过程中好好改正。第一次翻译,欢迎拍砖,可不要把我拍死了呀!!!

文章中带有LPSTUDY的字样表明是我个人的理解,可能会有不对的地方,敬请指教。

文章原文链接地址:

本文博客地址:

http://blog.csdn.net/lipeng08/article/details/7702707


内存管理策略

在引用计数机制下,你可以采用NSObject  protocol的方法和和标准的方法命名约定进行内存管理。NSObject也定义了一个dealloc方法,它在对象被释放的时候自动触发。本篇文章描述了在Cocoa中你需要了解的所有内存管理的基本规则,也提供了一些实例来让你正确的使用它。

 

基本内存管理规则

内存管理模型是建立在对象所有者基础上的,任何一个对象都可能有一个或者多个拥有着。只要一个对象至少有一个所有者,那么它就继续存在,如果没有拥有者,它就被自动释放。因此,你需要确定何时你拥有一个对象,何时你不再拥有它。Cocoa遵循以下的约定:

·     你拥有你自己创建的对象

你可以通过使用“alloc”,“new”,“copy”或者“mutableCopy”这样的方法来创建对象。

·     你可以使用retain来获取对象的所有权

不会翻译:Areceived object is normally guaranteed to remain valid within the method it wasreceived in, and that method may also safely return the object to its invoker.你在两种情况下使用retain,(1)在存取方法或者init方法中,为了给自己的数据赋值。(2)由于一些其他的操作的副作用可能导致你的对象失效,此时你需要调用retain操作 (as explained in “AvoidCausing Deallocation of Objects You’re Using”)

·     当你不再使用某一个对象,放弃它的所有权

你可以通过发送release或者autorelease消息来释放对象的所有权。在cocoa术语中,放弃对象的所有权意味着“释放”一个对象

·     当你不再拥有一个对象时,你不能释放它

这个与前面陈述的规定相一致

 

 

简单的例子

为了展示那些规定,看看下面的代码片段

{

    Person *aPerson = [[Person alloc] init];

    // ...

    NSString *name = aPerson.fullName;

    // ...

    [aPerson release];

}

 

通过使用alloc方法,Person对象被创建,因此当它不再被使用时,它随后调用release方法。Person的姓名没有使用任何的获取拥有权的方法,因此它也没有调用release方法。注意:本例子使用了release而不是autorelease

 

使用autorelease发送延迟释放消息

当你需要发送延迟释放消息的时候,你可以使用autorelease,典型的使用时候是当你需要从一个方法中返回一个对象。例如,你可以像这样实现fullName方法:

- (NSString *)fullName {

    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",

                                          self.firstName, self.lastName] autorelease];

    return string;

}

你通过带调用alloc方法拥有了这个字符串。为了遵循内存管理规则,在你失去对string的访问权限之前,你必须释放string的所有权。如果你采用了release方法,那么string就会在它被返回之前被释放.通过使用autorelease,你表明你想去释放拥有权,但是你又允许方法的调用者在它释放之前去使用返回的字符串。

 

你也可以像下面这样实现fullName方法:

- (NSString *)fullName {

    NSString *string = [NSString stringWithFormat:@"%@ %@",

                                 self.firstName, self.lastName];

    return string;

}

 

遵循基本的规则,你通过调用stringWithFormat,你并没有拥有string。因此,你可以安全的从方法中返回string。

 

作为对照,下面的实现是错误的

- (NSString *)fullName {

    NSString *string = [[NSString alloc] initWithFormat:@"%@ %@",

                                         self.firstName, self.lastName];

    return string;

}

通过命名的约定,毫无疑问fullName的调用者拥有了返回的string,但是调用者没有任何理由去释放返回的string,于是string所占用的内存泄露了。

 

你并不拥有返回引用的对象的所有权

在cocoa中有一些方法是通过引用返回的(也就是说,它们传递了一个这样的参数ClassName ** or id *).一个通常的模式是使用NSError对象来返回错误的详细信息,如 initWithContentsOfURL:options:error: (NSData)andinitWithContentsOfFile:encoding:error: (NSString).

 

在这些情况下,上述描述的规则依然适用。当你触发它们的任何一个方法的时候,你并没有创建NSError对象,因此你并没有拥有它,你也就没有必要去释放它。例子如下:

NSString *fileName = <#Get a file name#>;

NSError *error = nil;

NSString *string = [[NSString alloc] initWithContentsOfFile:fileName

                        encoding:NSUTF8StringEncoding error:&error];

if (string == nil) {

    // Deal with error...

}

// ...

[string release];

 

 

释放所有者对象的dealloc的实现                          

NSObject定义了一个dealloc方法,当一个对象没有拥有者而且它的内存被回收的时候,dealloc方法会被自动触发。Dealloc方法是为了释放对象的内存,安排它所拥有的资源,当然这也包含它拥有的实例变量。

 

下面的例子展示了在Person 类中怎么使用dealloc方法

@interface Person : NSObject {}

@property (retain) NSString *firstName;

@property (retain) NSString *lastName;

@property (assign, readonly) NSString *fullName;

@end

 

@implementation Person

@synthesize firstName=_firstName, lastName=_lastName;

// ...

- (void)dealloc

    [_firstName release];

    [_lastName release];

    [super dealloc];

}

@end

 

Attention:

·     你从不要去主动触发另一个对象的dealloc方法。

·     在自己的dealloc实现的末尾,你必须触发基类的dealloc方法

·       你不应该把系统资源的管理和对象的生命周期绑定到一起。see “Don’t Usedealloc to Manage Scarce Resources.

·     当程序终止时,对象可能并没有触发dealloc方法。由于在程序退出的时候,程序所占有的内存被自动清理,因此,仅仅让操作系统自己去清理资源比单纯的触发内存管理方法更有效。

 

Core Foundation使用相似但是不同的规则

对于Core Foundation,有相似的内存管理规则(see MemoryManagement Programming Guide for Core Foundation). 但是,Cocoa和Core Foundation的命名规范是不同的,特别的是:CoreFoundation的创建(see “The CreateRule” in MemoryManagement Programming Guide for Core Foundation)

规则并不适用于返回object-c对象的方法。例如,在下面的代码片段,你不需要释放myInstance的所有权。

MyClass *myInstance = [MyClass createInstance];


    
[2] 见习第五天——老大不在,自学成才。今日的十八个收获
    来源: 互联网  发布时间: 2014-02-18
实习第五天——老大不在,自学成才。今日的十八个收获
为了详细地记录一天中的各种小收获,我开始实时记笔记了。不过由于是在Ubuntu下的外文系统,所以不得不用英文了。

  • The communication from Android device to localhost running on local machine. 这个问题至今还没彻底解决,就是说在真机测试的时候要如何让手机访问本地电脑上架设的web服务器。请大家指教。
  • Want to add a loading page when login. Create un dialog in a new Thread : Exception, can't create handler inside Thread that has not called looper.prepare();这是对Android进程机制不够熟悉造成的问题。只要细心阅读相关资料定能解决。
  • Annule 2, continue the next.为了赶进度,没有查资料……
  • To use logcat with more than one devices。我同时在真机和模拟器里测试程序,但是logcat似乎无法兼顾。解决办法是到ddms界面中,选择当前使用的机器,再回到logcat就可以了。
  • 关于Android布局属性中weight的透彻解析:About Weight:The weight value allows you to specify the amount of remaining space each view should consume,relative to the amount consumed by sibling views, just like the ingredients in a drink recipe: "2parts vodka, 1 part coffee liquer" means two-thirds of the drink is vodka. For example, if you giveone view a weight of 2 and another one a weight of 1, the sum is 3, so the first view gets 2/3 ofthe remaining space and the second view gets the rest. If you give a third view a weight of 1,then the first view now gets 1/2 the remaining space, while the remaining two each get 1/4. 基本意思就是同一级别下的各个view的weight值代表了他们父控件给他们分配多余空间时的比重。
  • official site is powerful。Android开发者网站最近改版了。教程非常丰富。另外提醒大家,开发时下载的sample code也是不错的学习工具。
  • Adapter。各种Adapter是把view和view的数据绑定在一起的一个桥梁。
  • styles and themes.设计Android时也是可以考虑风格和主题的。   http://developer.android.com/guide/topics/ui/themes.html  
  • <include>_titlebar。 安卓xml也可以使用include以便对组件进行重用。如titlebar。
  • http://developer.android.com/design/style/metrics-grids.html 这个网址讲述了关于android设备的尺寸的问题。你的控件应该设置成多大?
  • http://developer.android.com/reference/android/view/View.html 设计界面之前最好能知道Android到底提供了哪些view。他们都是View类的子类。查看他的子类和间接子类就可以一览无余了。
  • QuickContactBadge. 这个主题还没有详细查看。
  • framelayout 不太好说,不过不难。可以自己查查看
  • use alignLeft... to overlay other view。如果想做出覆盖效果,可以把上层的view四边与底层view对齐。
  • use canvas。暂未详细查阅
  • view switcher。把两个view叠在一起,可以进行切换。同一时间,只能显示一个。
  • 如何在java代码中动态增加控件?我所涉及到的布局是GridView。需要做的是实现一个 BaseAdapter的子类,然后实现  getView方法。之后用GridView的setAdapter方法把两者联系起来。

  • 最后是一点体会——先把东西做出来,然后再一点点完善。这比想一下子就做完美要轻松一点。
    ok,又一天过去了,明天是实习以来的第一个周末,好好休息!

    程序猿和攻城狮都是人类的好朋友,注意身体啊!


    2楼han_yankun20093小时前谢谢分享1楼hejingyuan64小时前学习

        
    [3] DCT原形 ——傅里叶级数
        来源: 互联网  发布时间: 2014-02-18
    DCT原型 ——傅里叶级数
    傅里叶级数


    法国数学家傅里叶发现,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示(选择正弦函数与余弦函数作为基函数是因为它们是正交的),后世称为傅里叶级数(法语:série de Fourier,或译为傅里叶级数)。傅里叶级数在数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学等领域都有着广泛的应用。

    目录
    • 1傅里叶级数的公式
    • 2傅里叶级数的收敛性
    • 3三角函数族的正交性
    • 4奇函数和偶函数
    • 5傅里叶级数的一些例子
    • 6参阅
    • 7参考书目、资料来源
    傅里叶级数的公式

    给定一个周期为T的函数x(t),那么它可以表示为无穷级数:

    (i为虚数单位)(1)

    其中,可以按下式计算:

    (2)

    注意到是周期为T的函数,故k 取不同值时的周期信号具有谐波关系(即它们都具有一个共同周期T)。k=0时,(1)式中对应的这一项称为直流分量,也就是在整个周期的平均值。时具有基波频率,称为一次谐波或基波,类似的有二次谐波,三次谐波等等。

    傅里叶级数的收敛性

    至今还没有判断傅里叶级数的收敛性充分必要条件,但是对于实际问题中出现的函数,有很多种判别条件可用于判断收敛性。比如x(t)的可微性或级数的一致收敛性。在闭区间上满足狄利赫里条件的函数表示成的傅里叶级数都收敛。狄利赫里条件如下:

  • 在定义区间上,x(t)须绝对可积;
  • 在任一有限区间中,x(t)只能取有限个极值点;
  • 在任何有限区间上,x(t)只能有有限个第一类间断点。
  • 事实上,傅立叶级数在第一类间断点上收敛于初始函数左右极限的算术平均值。

    1966年,里纳特·卡尔松证明了勒贝格二次可积函数的傅立叶级数一定是几乎处处收敛的,即级数在除了一个可数点集外均收敛。

    吉布斯现象:在x(t)的不可导点上,如果我们只取(1)式右边的无穷级数中的有限项作和X(t),那么X(t)在这些点上会有起伏。一个简单的例子是方波信号。

    三角函数族的正交性

    所谓的两个不同向量正交是指它们的内积为0,这也就意味着这两个向量之间没有任何相关性,例如,在三维欧氏空间中,互相垂直的向量之间是正交的。事实上,正交是垂直在数学上的的一种抽象化和一般化。一组n个互相正交的向量必然是线性无关的,所以必然可以张成一个n维空间,也就是说,空间中的任何一个向量可以用它们来线性表出。三角函数族的正交性用公式表示出来就是:

    奇函数和偶函数

    奇函数可以表示为正弦级数:

    傅里叶级数的一些例子 参阅
    • 离散时间傅里叶级数
    • 傅里叶变换
    • 维尔斯特拉斯逼近定理


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3