标签:
#include <iostream> using namespace std; int main () { char p[]={‘a‘,‘b‘,‘c‘}, q[]="abc"; printf("%d %d\n",sizeof(p),sizeof(q)); //getch(); } //结果 3,4
sizeof有什么作用呢?
sizeof是C语言的关键字不并不是函数,这个很容易被忽略
sizeof(a)表示a在内存中所占的字节数
以下是windows NT下得32位c++程序,请计算sizeof的值
void Func(char str[100])
{
sizeof(str)=?
}
void *p=malloc(100);
sizeof(p)=?
答案:都是4个字节
但是我去面试的时候,下意思的就写成了100;
我们来分析一下:
Func(char str[100])函数中数组名作为函数形参的时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针; 在失去内涵的同时,他还失去了常用的特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4个字节,故sizeof(str)、sizeof(p)都为4
如果是在64位下,内存是8位; 32位系统下是4位
二、Cocoa Core Competencies 的Object creation 和 IOS面试题示例:写一个NSString类的实现
建立对象需要2个步骤 1分配内存,2初始化内存
1分配内存,要sent alloc
or allocWithZone:
message to the object’s class. 也就是常见的[Class alloc].或是不常见的[Class allocWithZone]
2初始化.要调用init的方法进行初始化,各种各样的要或不要参数的init方法都算.
以上建立对象的方式,返回值要送进 对象自动管理池
IOS面试题示例: 写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (const char*)nullTerminatedCString encoding: (NSStringEncoding)encoding { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj); }
The Form of an Object-Creation Expression
A convention in Cocoa programming is to nest the allocation call inside the initialization call.
MyCustomClass *myObject = [[MyCustomClass alloc] init];
+ (id)dataWithContentsOfURL:(NSURL *)url;
iOS应用开发:什么是ARC?
ARC是iOS 5推出的新功能,全称叫ARC(Automic Reference Counting).简单的说,就是代码中自动加入了retain/release,原来需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
简单的理解ARC,就是通过制定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,他只是一种代码静态分析(Static Analyzer)工具。
ARC使用前后的变化,我们通过代码来实现
@interface NonARCObject : NSObject { NSString *name; } -(id)initWithName:(NSString *)name; @end @implementation NonARCObject -(id)initWithName:(NSString *)newName { self = [super init]; if (self) { name = [newName retain]; } return self; } -(void)dealloc { [name release]; [Super dealloc]; } @end
@interface ARCObject : NSObject { NSString *name; } -(id)initWithName:(NSString *)name; @end @implementation ARCObject -(id)initWithName:(NSString *)newName { self = [super init]; if (self) { name = newName; } return self; } @end
而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。
使用ARC的好处?
使用ARC有什么好处呢?
ARC不好的地方?
关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。
这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。
如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。
ARC 的基本规则?
由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。
ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。
什么是强参照 (Strong reference)?
firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。
这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。
这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。
追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。
将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。
什么是弱参照 (Weak reference)?
接下来我们来看看弱参照 (Weak reference) 的使用方式。
(w1)
与强参照方式同样,firstName作为字符串对象@”natsu”的持有者存在。即是该NSString类型对象的Strong reference。
使用关键字__weak,声明弱参照weakName变量,将firstName代入。这时weakName虽然参照@”natsu”,但仍是Weak reference。即weakName虽然能看到@”natsu”,但不是其持有者。
firstName指向了新的对象@”maki”,成为其持有者,而对象@”natsu”因为没有了持有者,即被破弃。同时weakName变量将被自动代入nil。
ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。
变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。
上面已经看到了,这是弱参照的关键字。该概念是新特性,从 iOS 5/ Mac OS X 10.7 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。
NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]]; NSLog(@"string: %@", string); //此时 string为空
如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。
弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。
该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。
该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。
- (void) generateErrorInVariable:(__autoreleasing NSError **)paramError { .... *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary]; } .... { NSError *error = nil; [self generateErrorInVariable:&error]; NSLog(@"Error = %@", error); }
又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。
-(NSString *)stringTest { NSString *retStr = [NSString stringWithString:@"test"]; return [[retStr retain] autorelease]; } // 使用ARC -(NSString *)stringTest { __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"]; return retStr; }
即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。
原文地址:http://www.yifeiyang.net/development-of-the-iphone-simply-1/
标签:
原文地址:http://www.cnblogs.com/CCMMBN/p/5410599.html