`
sslaowan
  • 浏览: 374065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IPhone&OBC问题记录

 
阅读更多

1 外部变量到底是怎么回事?是在一个文件的所有@interface,@implements 块外声明的变量,那么声明时不使用extenal关键字,而在使用时使用?在其他文件里可以用这个文件里的这个外部变量?

2 协议的用途究竟是什么?如果一个类遵循某协议,是不是就不用在@interface里声明那些方法了?

3 autorelease,如果当时无法release,则可以像自动释放池发送autorelease消息,当执行到[pool drain]时其就会收到release消息,计数器-1,如果等于0则被回收。那是不是所有使用release的时候都可以替换为autorelease方案呢?应该是不行,因为你retain了好几次,但是只能autorelease一次。

4 使用alloc,new,copy,retain都需要release释放,放到集合时计数器+1,同时放入到自动释放池中,移出集合计数器-1。retain一次就要release一次,或者发送一个autorelease,让pool帮你发送release。字符串使用stringWithString创建也一样,计数器+1,并autorelease,所以使用时可以通过retain以免被释放。IPhone的那些UI组件好像也都是如此。

关于内存管理有个总结帖http://www.cocoachina.com/bbs/read.php?tid-12760-fpage-3.html

目前对于跟UI有关的内存问题还是没太搞清楚,比如尼玛这个为啥就不需要释放呢?

 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
    self.window.rootViewController = self.tabBarController;
 

5 指针,间接访问数据项。

   int *a 告诉编译器a是个指针

   int b=10,a=&b,把b的指针赋值给a,而不是把b的值给a。指针就是指向那个值的一个东东(不准确地说法就是引用或者句柄,但实际上它们的关系是引用可以通过指针等方式实现),可以说指针是这个数据所在的地址,变量可以到这个地址去取数。

   int x=*a,*表示从这个指针变量中取数,然后把这个数值赋给x。

   其实折腾这么多步干了一件事 x=b=10。

   但是如果地址对应的内容会变化,那么就可以每次通过*号取出不同的值,而不是把内容直接赋值给变量。

   这东西都是针对于C语言说的,在OBC中,对象就是引用赋值的(也可以理解为指针)。比如A *a1=[[A alloc] init]; A *a2=a1,就是将a2也指向了a1对应的对象。但是这个对象的引用计数仍然不变,手工方式只有通过retain才能增加引用技术。

   另一个例子:char c='C';

   注意char *a=&c;

       和char *a; a=&c;

      以及

        char *a=&c; *a='I';表示将字符‘I’赋值给了变量a指向的那个数据(通过指针找到了数据存放位置,然后把值替换了),此时c和a的值都是‘I’

 

   对于结构体 struct A{  int a; }; 可以这样A->a=10; 、、

 

   有时有的东西看起来像对象其实不是,就不能定义为指针变量,比如NSInteger

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics