__attribute__机制是GNU
C的一大特色,增强编译器的功能,带来更多的检查,更多的优化。可以设置函数特性,变量特性,类型特性,标签特性,枚举特性,语法格式是__attribute__((attributes))。不同的编译器在细节上会有差别,持有的特性也不尽相同。下面介绍几种Objective-C中可以使用的特性。

二维码已经在完全融入我们的生活,就在街上买个煎饼果子都能扫二维码.今天我就二维码的实现,来简单阐述一下.我这里写三个二维码,分别是1
.生成普通的黑白二维码,比较普遍2
.还有一种是彩色二维码,虽然显得高大上一些,但是由于容错率相对比较低,所以市面上还是比较少的.

废话不多说,直接代码吧,但是两个方法有有大部分重叠,没有封装,比较原始的这样分开直接粘贴就能用.

今天来简要介绍下Apple
Watch中的Table组件,以及构建一个简单的基于Table的Watch App。

  • __attribute__((deprecated))可以用来修饰变量,方法,类和协议,表明被废弃,如果使用,编译器会发出警告。可以添加说明,用法__attribute__((deprecated(“use
    Another class.”)))。

  • __attribute__((unavailable))可以用来修饰变量,方法,类和协议,表明不可用,如果使用,编译器会发出错误。同deprecated,可以添加说明。

  • __attribute__()用来修饰属性,表明Core
    Fundation类型的属性应该按照Objective-C的对象来进行内存管理。比如
    @property __attribute__() CFDictionaryRef myDictionary;

  • __attribute__((objc_designated_initializer))用来修饰类的designated
    initializer初始化方法,如果修饰的方法里没有调用超类的 designated
    initializer,编译器会发出警告。可以简写成NS_DESIGNATED_INITIALIZER。

  • __attribute__((constructor))用来修饰函数,函数的返回值为void,参数为void,会在main函数开始之前调用。可以指定优先级(大于100,0到100为系统保留),多个修饰的函数,按照优先级高低顺序执行。

  • __attribute__((destructor))用来修饰函数,返回值和参数同constructor,会在main函数结束之后调用。优先级同constructor。

//// ViewController.m// 二维码生成//// Created by hhq on 16/7/15.// Copyright © 2016年 com.baiduniang. All rights reserved.//#import "ViewController.h"@interface ViewController ()@property (nonatomic, strong) UIImageView * imageView; //普通黑白视图@property (nonatomic, strong) UIImageView * colorImageview; //彩色视图@end@implementation ViewController- viewDidLoad { [super viewDidLoad]; //二维码生成 实质: 把字符串转变为 图片 // 需要 coreImage框架, 已经包含在了 UIKit框架里面 [self qrCode]; [self colorQrcode]; }//MARK:普通黑白二维码-qrCode{ //获取内建的所有过滤器. // NSArray *filterArr = [CIFilter filterNamesInCategories:kCICategoryBuiltIn]; //也对 NSArray * filterArr = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]]; //对// NSLog(@"%@",filterArr);//所有内建过滤器,找CR...二维码的 //二维码过滤器 CIFilter *qrImageFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //设置过滤器默认属性  [qrImageFilter setDefaults]; //将字符串转换成 NSdata (虽然二维码本质上是 字符串,但是这里需要转换,不转换就崩溃) NSData *qrImageData = [@"你看我帅不帅" dataUsingEncoding:NSUTF8StringEncoding]; //我们可以打印,看过滤器的 输入属性.这样我们才知道给谁赋值 NSLog(@"%@",qrImageFilter.inputKeys); /* inputMessage, //二维码输入信息 inputCorrectionLevel //二维码错误的等级,就是容错率 */ //设置过滤器的 输入值 ,KVC赋值 [qrImageFilter setValue:qrImageData forKey:@"inputMessage"]; //取出图片 CIImage *qrImage = [qrImageFilter outputImage]; //但是图片 发现有的小 ,我们需要放大..我们进去CIImage 内部看属性 qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale]; self.imageView.image = [UIImage imageWithCIImage:qrImage]; // self.imageView.image = [UIImage imageWithCIImage:qrImage scale:100.0 orientation:UIImageOrientationUp]; // //如果还想加上阴影,就在ImageView的Layer上使用下面代码添加阴影 self.imageView.layer.shadowOffset=CGSizeMake;//设置阴影的偏移量 self.imageView.layer.shadowRadius=1;//设置阴影的半径 self.imageView.layer.shadowColor=[UIColor redColor].CGColor;//设置阴影的颜色为黑色 self.imageView.layer.shadowOpacity=0.3;}//MARK:彩色的二维码-colorQrcode{ //二维码的实质是 字符串, 我们生产二维码,就是根据字符串去生产一张图片 //获取内建的所有过滤器. // NSArray *filterArr = [CIFilter filterNamesInCategories:kCICategoryBuiltIn]; //也对 NSArray *filterArr = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]]; //对 NSLog(@"%@",filterArr); //所有内建过滤器,找CR... 二维码的 //创建二维码过滤器 CIFilter * qrfilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //设置默认属性 [qrfilter setDefaults]; //我们需要给 二维码过期器 设置一下属性,给它一些东西,让它去生成图片吧,那些属性呢,跳进去看 NSLog(@"%@",qrfilter.inputKeys); /* inputMessage, //二维码的信息 inputCorrectionLevel //二维码的容错率 ()到达一定值后,就不能识别二维码了 */ //我们需要给 二维码 的 inputMessage 设置值, 这是私有属性,我们 使用KVC.给其私有属性赋值 //将字符串转为NSData,去获取图片 NSData * qrimgardata = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding]; //去获取对应的图片(因为测试,直接用字符串会崩溃) [qrfilter setValue:qrimgardata forKey:@"inputMessage"]; //去获得对应图片 outPut CIImage *qrImage = qrfilter.outputImage; //图片不清除,打印知道其 大小 为 . 进入 CIImage,看属性, qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale]; //创建彩色过滤器 ----------------------------------------------------- CIFilter * colorFilter = [CIFilter filterWithName:@"CIFalseColor"]; //设置默认值 [colorFilter setDefaults]; //同样打印这样的 输入属性 inputKeys NSLog(@"%@",colorFilter.inputKeys); /* inputImage, //输入的图片 inputColor0, //前景色 inputColor1 //背景色 */ //KVC 给私有属性赋值 [colorFilter setValue:qrImage forKey:@"inputImage"]; //需要使用 CIColor [colorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0.8] forKey:@"inputColor0"]; [colorFilter setValue:[CIColor colorWithRed:0 green:1 blue:0.4] forKey:@"inputColor1"]; //设置输出 CIImage *colorImage = [colorFilter outputImage]; self.colorImageview.image = [UIImage imageWithCIImage:colorImage]; }-(UIImageView *)imageView{ if(_imageView == nil){ _imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 260, 200, 200)]; [self.view addSubview:_imageView]; } return _imageView;}-(UIImageView *)colorImageview{ if (_colorImageview == nil) { _colorImageview = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 200, 200)]; [self.view addSubview:_colorImageview]; } return _colorImageview;}@end

WatchKit,顾名思义,是由苹果官方提供的用于开发Apple Watch
App的框架。在WatchKit中,Table组件对应于iOS中的Table View。但和Table
View相比,Table有不少局限,主要体现在以下几个方面:

deprecated、unavailable、NSObject、objc_designated_initializer应该涵盖了大部分的应用场景,constructor/destructor
目前只在libextobjc中见到运用,在main函数之前可以干很多黑魔法的事。

图片 1彩色和黑白二维码.png

  1. 由于Watch
    App通过蓝牙连接来和匹配的iPhone进行交流,所以对于Table的更新应尽可能减少,以免造成更新不及时的情况。
  2. Table对应的WKInterfaceTable类没有使用iOS中UITableView相关的循环机制,所有的Row都会在Table展示前创建好。因此,基于性能考虑,Table的Row数量通常限制在20以内。
  3. WatchKit中的UI组件必须在Storyboard中进行布局,且没有AutoLayout功能,因此布局方式十分受限。
  4. Table中每一种类型的Row都必须有一个对应的Controller来进行管理,Table没有DataSource和Delegate。

更多__attribute__介绍,可以参考

打开Xcode,选择Create a new Xcode project,选择watchOS -> Application
-> iOS App with WatchKit
App。我将这个工程取名为WatchTable,且不勾选其它任何选项,进行创建。创建后的工程结构如下图所示:

图片 2工程结构

可以看到,整个工程分为以下4块:

  1. WatchTable文件夹对应于iOS的开发代码。
  2. WatchTable WatchKit App文件夹包含watchOS的Storyboard。
  3. WatchTable WatchKit Extension文件夹包含watchOS的开发代码。
  4. Products文件夹包含生成的App。

选择WatchKit App进行运行,既能够在Watch Simulator中看到运行结果。

图片 3运行选项

打开watchOS的stroyboard,拖入一个Table组件,将其Row数量设为2,在一个Row中拖入一个Label,在另一个Row中拖入一个Image,并在Attributes
inspector中进行相应设置,如下图所示:

发表评论

电子邮件地址不会被公开。 必填项已用*标注