【笔记】iOS开发基础笔记<四>

引用自 http://www.cocoachina.com/ios/20160323/15770.html

1.循环引用的产生和解决

产生:对象A和对象B相互引用了对方作为自己的成员变量,只有自己销毁的时候才能将成员变量的引用计数减1。对象A的销毁依赖于对象B的销毁,同时对象B销毁也依赖与对象A的销毁,从而形成循环引用,此时,即使外界没有任何指针访问它,它也无法释放。

解决:①事先知道存在循环引用的地方,在合理的位置主动断开一个引用,是对象回收;②使用弱引用的方法。

2.#include#import的区别,#import @class 的区别

  • #include 和#import其效果相同,都是查询类中定义的行为(方法);
  • #import不会引起交叉编译,确保头文件只会被导入一次;
  • @class 的表明,只定 义了类的名称,而具体类的行为是未知的,一般用于.h 文件;
  • @class 比#import 编译效率更高。@class 和#import 的主要区别在于解决引用死锁的问题,防止进程阻塞。

3.关键词含义

@public:对象的实例变量的作用域在任意地方都可以被访问 ;
@protected:对象的实例变量作用域在本类和子类都可以被访问 ;

@private:实例变量的作用域只能在本类(自身)中访问 .

@property

@implementation

 

4.怎样使用performSelector传入3个以上参数,其中一个为结构体。

因为系统提供的performSelector的API中,并没有提供三个参数。因此,我们只能传数组或者字典,但是数组或者字典只有存入对象类型,而结构体并不是对象类型,我们只能通过对象放入结构作为属性来传过去了.

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:
   (id)object1 withObject:(id)object2;

  

具体实现如下:

typedef struct HYBStruct {
int a;
int b;
} *my_struct;
 
@interface HYBObject : NSObject
 
@property (nonatomic, assign) my_struct arg3;
@property (nonatomic, copy)  NSString *arg1;
@property (nonatomic, copy) NSString *arg2;
 
@end
@implementation HYBObject
。
// 在堆上分配的内存,我们要手动释放掉
- (void)dealloc {
free(self.arg3);
}
 
@end

  

my_struct str = (my_struct)(malloc(sizeof(my_struct)));
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str; 
[self performSelector:@selector(call:) withObject:obj]; 
// 在回调时得到正确的数据的
- (void)call:(HYBObject *)obj {
 NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}

  5.

posted @ 2016-04-18 18:48  _yfan  阅读(365)  评论(0编辑  收藏  举报