iOS 结构体 定义变量注意事项以及保存到数组与读取


typedef  struct

{   CGFloat  x;

    CGFloat  y ;

}  point;


    结构体通常都是以上这样的,需要注意的结构体内定义的只能是基本数据类型的变量,而不能是对象。如若非要用结构体存放对象也可以,需要在对象前面添加标识__unsafe_unretained,如__unsafe_unretained UIImage *imageNew,但是这样也可能会出现一些奇怪的问题,所以不建议使用,需要定义对象时还是建一个类去存储。

    具体原因是因为:ARC需要在一个合适的位置插入成员的释放行为,在Objective-C中,编译器会把实例成员的release放在该类型的实例方法dealloc中。而由于标准的C结构体,即struct,是没有析构函数的,所以编译器无法在合适的位置插入成员的release操作。从而导致内存泄漏。所以,在ARC项目中,不做特殊处理是无法在struct中声明Objective-C对象的,除非明确指定放弃对所声明对象的内存管理责任,即楼上提到的,将对象定义为__unsafe_unretain,这样ARC就不会想办法插入release操作了


下面是结构体保存到数组与读取

typedef  struct

{   CGFloat  x;

    CGFloat  y ;

}  pointNew;


NSMutableArray *arrayOne = [NSMutableArray array];

//保存

for (unsigned i = 0 ; i<5; i++) {

    pointNew s;

    s.x = i;

    s.y = 1.0;

   

    NSValue *value = nil;

    value = [NSValue valueWithBytes:&s objCType:@encode(pointNew)];

    [arrayOne addObject:value];

}

//读取

for (NSValue *value in arrayOne) {

     pointNew s;

    [value getValue:&s];

    NSLog(@"%f",s.x);

}





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wy10207010219/article/details/42550779
个人分类: Object-C基础知识
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭