当前位置:  编程技术>移动开发
本页文章导读:
    ▪Objective-c门类大小(值域)        Objective-c类型大小(值域) This is a good overview:http://reference.jumpingmonkey.org/programming_languages/objective-c/types.html or run this code NSLog( @"Primitive sizes:" ) ; NSLog( @"The size of a char is: %d." , sizeof( char ) ) ; NSLog( @.........
    ▪ listView的替空时显示        listView的为空时显示 TextView tv=new TextView(this); tv.setText("学校"); tv.setGravity(Gravity.CENTER); LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); addContentView(tv, params); pausList.setEmpt.........
    ▪ Objective-C中init函数兑现的相关研究       Objective-C中init函数实现的相关研究 今天在学习Objective-C时见到某初始化函数中有如下代码:     self = [super init];       if(self){   // Initialize members       }       return self;     当时只.........

[1]Objective-c门类大小(值域)
    来源: 互联网  发布时间: 2014-02-18
Objective-c类型大小(值域)

This is a good overview:

http://reference.jumpingmonkey.org/programming_languages/objective-c/types.html

or run this code

NSLog(
@"Primitive sizes:"
)
;
NSLog(
@"The size of a char is: %d."
, sizeof(
char
)
)
;
NSLog(
@"The size of short is: %d."
, sizeof(
short
)
)
;
NSLog(
@"The size of int is: %d."
, sizeof(
int
)
)
;
NSLog(
@"The size of long is: %d."
, sizeof(
long
)
)
;
NSLog(
@"The size of long long is: %d."
, sizeof(
long
 long
)
)
;
NSLog(
@"The size of a unsigned char is: %d."
, sizeof(
unsigned char
)
)
;
NSLog(
@"The size of unsigned short is: %d."
, sizeof(
unsigned short
)
)
;
NSLog(
@"The size of unsigned int is: %d."
, sizeof(
unsigned int
)
)
;
NSLog(
@"The size of unsigned long is: %d."
, sizeof(
unsigned long
)
)
;
NSLog(
@"The size of unsigned long long is: %d."
, sizeof(
unsigned long
 long
)
)
;
NSLog(
@"The size of a float is: %d."
, sizeof(
float
)
)
;
NSLog(
@"The size of a double is %d."
, sizeof(
double
)
)
;
 
NSLog(
@"Ranges:"
)
;
NSLog(
@"CHAR_MIN:   %c"
,   CHAR_MIN)
;
NSLog(
@"CHAR_MAX:   %c"
,   CHAR_MAX)
;
NSLog(
@"SHRT_MIN:   %hi"
,  SHRT_MIN)
;    // signed short int

NSLog(
@"SHRT_MAX:   %hi"
,  SHRT_MAX)
;
NSLog(
@"INT_MIN:    %i"
,   INT_MIN)
;
NSLog(
@"INT_MAX:    %i"
,   INT_MAX)
;
NSLog(
@"LONG_MIN:   %li"
,  LONG_MIN)
;    // signed long int

NSLog(
@"LONG_MAX:   %li"
,  LONG_MAX)
;
NSLog(
@"ULONG_MAX:  %lu"
,  ULONG_MAX)
;   // unsigned long int

NSLog(
@"LLONG_MIN:  %lli"
, LLONG_MIN)
;   // signed long long int

NSLog(
@"LLONG_MAX:  %lli"
, LLONG_MAX)
;
NSLog(
@"ULLONG_MAX: %llu"
, ULLONG_MAX)
;  // unsigned long long int 

When run on an iPhone 3GS (iPod Touch and older iPhones should yield the same result) you get:

Primitive sizes:

The size of a char
 is: 1
.
The
 size of short
 is: 2
.
The
 size of int
 is: 4
.
The
 size of long
 is: 4
.
The
 size of long
 long
 is: 8
.
The
 size of a unsigned char
 is: 1
.
The
 size of unsigned short
 is: 2
.
The
 size of unsigned int
 is: 4
.
The
 size of unsigned long
 is: 4
.
The
 size of unsigned long
 long
 is: 8
.
The
 size of a float
 is: 4
.
The
 size of a double
 is 8
.
Ranges
:
CHAR_MIN:   -128

CHAR_MAX:   127

SHRT_MIN:   -32768

SHRT_MAX:   32767

INT_MIN:    -2147483648

INT_MAX:    2147483647

LONG_MIN:   -2147483648

LONG_MAX:   2147483647

ULONG_MAX:  4294967295

LLONG_MIN:  -9223372036854775808

LLONG_MAX:  9223372036854775807

ULLONG_MAX: 18446744073709551615

    
[2] listView的替空时显示
    来源: 互联网  发布时间: 2014-02-18
listView的为空时显示

TextView tv=new TextView(this);
tv.setText("学校");
tv.setGravity(Gravity.CENTER);


LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
addContentView(tv, params);
pausList.setEmptyView(tv);
 
 

    
[3] Objective-C中init函数兑现的相关研究
    来源: 互联网  发布时间: 2014-02-18
Objective-C中init函数实现的相关研究

今天在学习Objective-C时见到某初始化函数中有如下代码:

    self = [super init];
 
    if(self){
 
// Initialize members
 
    }
 
    return self;

    当时只是觉得Objective-C与才C++应该一样,每个子类对象都包含父类对象,所以super与self都是指向同一对象的头部的,[super init]返回的地址应该与self所代表的地址一样(即self == [super init])。那么,对self赋[super init]的值岂不是没有什么意义?
 
    找朱去讨论,他也不知道是因为什么。但是他想起了在《From C++ to Objective-C》中好像提到过这个情况,于是在一通查找之后终于在7.1.3(P25)找到了说明。那一节的例子中的对应代码是这样的:

    if(![super init])
 
return nil;
 
   // Initialize members
 
return self;

    同时下面又相应的说明:
 
    Polemic: Most people use the instruction self = [super init]; if (self) {...} in the initializer. This is justified by the fact that in some cases, [super init] could return a different object. However, in a very interesting document [6], Will Shipley shows that is a bad practice. It is far more logical to use the above form, where it is only checked whether [super init] returns nil or not.
 
    意思是很多人采用了self = [super init]; if (self) {...}的方法,这是由于有一些实践已经证明了[super init]有可能返回一个(与self所指对象)完全不同的对象。但作者推荐了一篇文章,说这篇文章证实了这个为大多数人所使用的初始化方式是一种不好的 手法。
 
    这里所说的 a very interesting document[6] 指的是:
 
    [6] Will Shipley. self = [supid init]. http://wilshipley.com/blog/2005/07/ self-stupid-init.html. 
 
    是一篇博文。在这篇博文里,作者对比了两种形式的初始化方法,它们是:

    1.Traditional -init

    - (id)init;
 
    {
 
if ((self = [super init]) == nil)
 
   return nil;

[...initialize my stuff...]
 
return self;
 
    }

    2.Wil's -init

    - (id)init;
 
    {
 
if (![super init])
 
   return nil;

[...initialize my stuff...]
 
return self;
 
    }

    作者认为不可能存在不用self = [super init]就不对的情况,所以他认为第二种方法才是正确的。他曾在以前的一篇博文上说谁能找到这样的情况就给那人20美元。
 
    但现在作者坦言这样的情况确实存在——一个名叫Ken Ferry的人编写了一个程序,该程序会自动为Cocoa库的每一个类派生出子类并产生程序将其实例化,并在初始化时判断[super init]是否返回的就是self。最终该程序Ken Ferry终于找到了一些这样的类——它们都是 single intance(单实例)的类。
 
    说到这里大家想必也都知道是怎么回事了,单实例的类初始化函数在第一次被调用时会返回新的实例,以后再被调用则只会返回第一次生成的实例。在这种情况下, 作者提出的方式2也就有了问题 ——若遇到父类采用单例模式,则在子类中[super init]返回的确实非nil,但却也不再是子类对象所包含的那个父类对象了。如此一来子类对象所包含的那个父类对象并未被初始化,没有达到初始化函数的 目的。
 
    但是我们也应该注意到第一种方式也是不对的——self被重新定向为指向父类那个单实例,如此一来则发生了内存泄露,因为self原先所指向的对象变成了“没有链子栓着的狗”(没有指针指向它)。
 
    原来两种方式都存在不足,那么该如何是好呢?作者提出了第三种方式:

    id superInitReturn = [super init];
 
    if(!superInitReturn || self != superInitReturn)
 
    {
 
return nil;
 
    }
 
    // Initialize memebers
 
    return self;

   我个人对此方法的理解是:若[super init]返回的与self不同,则说明父类是单实例类,而单实例类的init函数应该是被重写过的,一般会返回nil,遇到这种情况我们就该收手了—— 让你的类去继承一个单实例类并非好的设计(如果想达到类似效果,请让这个单实例成为你的类的成员)——故而返回nil。

    值得一提的是该博文为作者2005年所作,作者于2009年在末尾追加了更新,指出苹果公司有些说明表明了他们很有可能要重写[NSObject init]方法,主要是因为要采用新的内存管理手段以提高内存重用率,所以作者最终推荐的init方式为:

    -(id) init
 
    {
 
if(!(self = [super init]))
 
{
 
   return nil;
 
}
 
// Initialize members
 
return self;
 
    }

    原文如下:
 
    Update April, 2009:

There's been hints from Apple that they might modify the standard -[NSObject init] method to try to re-use old object's memory, since it turns out that a very common usage pattern is for programs to keep creating and deallocating, say, 12 objects of the same class, over and over. Re-using the exact same memory ends up being a big win (and this is a trick the iPhone already does with its UITableViewCell class, and that is a HUGE win if you do it yourself on the iPhone).

So, from now on, I recommend everyone uses:

Subclassing NSColorPanel the Right Way
 
- (id)init;
 
{
 
if (!(self = [super init]))
 
   return nil;

// other stuff
 
return self;
 
}

I do.

    我还是感到不解,看不出他的理由是什么。明天继续研究,也希望有高手能来指点一二。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Cheng_Tian/archive/2010/07/16/5740831.aspx


    
最新技术文章:
▪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提高之多方向抽屉实现方法 iis7站长之家
▪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